"Beachten Sie, dass Sie die Methode nicht vor dem Anzeigen von Layouts aufrufen können."
Der obige Text ist der Hinweis.
Dialoge haben einen Listener, der ausgelöst wird, sobald der Dialog angezeigt wird . Der Dialog kann nicht angezeigt werden, wenn er nicht angelegt ist.
Rufen Sie also in onCreateDialog()
Ihrem modalen unteren Blatt ( BottomSheetFragment
) kurz vor dem Zurücksenden des Dialogfelds (oder irgendwo, sobald Sie einen Verweis auf das Dialogfeld haben) Folgendes auf:
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
BottomSheetDialog d = (BottomSheetDialog) dialog;
FrameLayout bottomSheet = (FrameLayout) d.findViewById(android.support.design.R.id.design_bottom_sheet);
BottomSheetBehavior.from(bottomSheet)
.setState(BottomSheetBehavior.STATE_EXPANDED);
}
});
In meinem Fall stellte BottomSheet
sich heraus, dass mein Brauch :
@SuppressWarnings("ConstantConditions")
public class ShareBottomSheetFragment extends AppCompatDialogFragment {
@NonNull @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
BottomSheetDialog dialog =
new BottomSheetDialog(getActivity(), R.style.Haute_Dialog_ShareImage);
dialog.setContentView(R.layout.dialog_share_image);
dialog.findViewById(R.id.cancel).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
BottomSheetDialog d = (BottomSheetDialog) dialog;
FrameLayout bottomSheet = (FrameLayout) d.findViewById(android.support.design.R.id.design_bottom_sheet);
BottomSheetBehavior.from(bottomSheet).setState(BottomSheetBehavior.STATE_EXPANDED);
}
});
SwitchCompat switchview = (SwitchCompat) dialog.findViewById(R.id.switchview);
switchview.setTypeface(FontCache.get(dialog.getContext(), lookup(muli, NORMAL)));
return dialog;
}
}
Lassen Sie mich wissen, ob das hilft.
AKTUALISIEREN
Beachten Sie, dass Sie Folgendes überschreiben können BottomSheetDialogFragment
:
public class SimpleInitiallyExpandedBottomSheetFragment extends BottomSheetDialogFragment {
@NonNull @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
BottomSheetDialog dialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState);
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
BottomSheetDialog d = (BottomSheetDialog) dialog;
FrameLayout bottomSheet = (FrameLayout) d.findViewById(android.support.design.R.id.design_bottom_sheet);
BottomSheetBehavior.from(bottomSheet).setState(BottomSheetBehavior.STATE_EXPANDED);
}
});
return dialog;
}
}
Aber ich verstehe wirklich nicht, warum irgendjemand das tun möchte, da die Basis BottomSheetFragment
nichts anderes tut, als a zurückzugeben BottomSheetDialog
.
UPDATE FÜR ANDROIDX
Bei Verwendung von AndroidX kann die zuvor gefundene Ressource android.support.design.R.id.design_bottom_sheet
jetzt unter gefunden werden com.google.android.material.R.id.design_bottom_sheet
.
BottomSheetDialogFragment
Bild ruckelig erscheinen (scheint Frames in der Eröffnungsanimation zu überspringen), wenn es vom reduzierten zum erweiterten Verhalten übergeht. Bearbeiten: Getestet auf Android Marshmallow und KitKat Geräten