"Tenga en cuenta que no puede llamar al método antes de ver diseños".
El texto anterior es la clave.
Los diálogos tienen un oyente que se activa una vez que se muestra el diálogo . El cuadro de diálogo no se puede mostrar si no está diseñado.
Entonces, en la onCreateDialog()
parte inferior de su hoja modal ( BottomSheetFragment
), justo antes de devolver el diálogo (o en cualquier lugar, una vez que tenga una referencia al diálogo), llame a:
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);
}
});
En mi caso, mi costumbre BottomSheet
resultó ser:
@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;
}
}
Déjeme saber si esto ayuda.
ACTUALIZAR
Tenga en cuenta que también puede anular BottomSheetDialogFragment
como:
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;
}
}
Pero realmente no veo por qué alguien querría hacer eso ya que la base BottomSheetFragment
no hace nada más que devolver un BottomSheetDialog
.
ACTUALIZAR PARA ANDROIDX
Al usar AndroidX, el recurso que se encontraba anteriormente en android.support.design.R.id.design_bottom_sheet
ahora se puede encontrar en com.google.android.material.R.id.design_bottom_sheet
.
BottomSheetDialogFragment
parezca inestable (parece saltar fotogramas en la animación de apertura) a medida que pasa del comportamiento contraído al expandido. Editar: probado esto en dispositivos Android Marshmallow y KitKat