"Notez que vous ne pouvez pas appeler la méthode avant d'afficher les mises en page."
Le texte ci-dessus est l'indice.
Les boîtes de dialogue ont un écouteur qui est déclenché une fois la boîte de dialogue affichée . La boîte de dialogue ne peut pas être affichée si elle n'est pas mise en page.
Donc, dans le onCreateDialog()
de votre feuille de fond modale ( BottomSheetFragment
), juste avant de retourner la boîte de dialogue (ou n'importe où, une fois que vous avez une référence à la boîte de dialogue), appelez:
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);
}
});
Dans mon cas, ma coutume BottomSheet
s'est avérée être:
@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;
}
}
Faites-moi savoir si cela vous aide.
MISE À JOUR
Notez que vous pouvez également remplacer BottomSheetDialogFragment
comme:
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;
}
}
Mais je ne vois vraiment pas pourquoi quelqu'un voudrait faire cela car la base BottomSheetFragment
ne fait rien d'autre que de renvoyer un fichier BottomSheetDialog
.
MISE À JOUR POUR ANDROIDX
Lors de l' utilisation AndroidX, la ressource trouvée précédemment à android.support.design.R.id.design_bottom_sheet
peut maintenant être trouvé à com.google.android.material.R.id.design_bottom_sheet
.
BottomSheetDialogFragment
impression que le comportement est saccadé (semble sauter des images dans l'animation d'ouverture) en passant du comportement réduit au comportement développé. Edit: Testé ceci sur les appareils Android Marshmallow et KitKat