"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 BottomSheetsich 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 BottomSheetFragmentnichts 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_sheetjetzt unter gefunden werden com.google.android.material.R.id.design_bottom_sheet.
BottomSheetDialogFragmentBild 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