"Observe que você não pode chamar o método antes de visualizar os layouts."
O texto acima é a pista.
Os diálogos têm um ouvinte que é disparado assim que o diálogo é mostrado . A caixa de diálogo não pode ser exibida se não estiver disposta.
Portanto, no onCreateDialog()
de sua folha de fundo modal ( BottomSheetFragment
), antes de retornar o diálogo (ou em qualquer lugar, uma vez que você tenha uma referência para o diálogo), chame:
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);
}
});
No meu caso, meu costume BottomSheet
acabou sendo:
@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;
}
}
Avise-me se isso ajudar.
ATUALIZAR
Observe que você também pode substituir 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;
}
}
Mas eu realmente não vejo por que alguém iria querer fazer isso já que a base BottomSheetFragment
não faz nada além de retornar um BottomSheetDialog
.
ATUALIZAÇÃO PARA ANDROIDX
Ao usar o AndroidX, o recurso anteriormente encontrado em android.support.design.R.id.design_bottom_sheet
agora pode ser encontrado em com.google.android.material.R.id.design_bottom_sheet
.
BottomSheetDialogFragment
pareça instável (parece pular quadros na animação de abertura) à medida que vai do comportamento recolhido ao expandido. Editar: Testado em dispositivos Android Marshmallow e KitKat