«Обратите внимание, что вы не можете вызвать метод перед просмотром макетов».
Приведенный выше текст является подсказкой.
У диалогов есть слушатель, который запускается после показа диалога . Диалог не может быть показан, если он не выложен.
Итак, в onCreateDialog()
вашем модальном нижнем листе ( BottomSheetFragment
), непосредственно перед возвратом диалогового окна (или где угодно, если у вас есть ссылка на диалоговое окно), вызовите:
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);
}
});
В моем случае мой обычай BottomSheet
оказался таким:
@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;
}
}
Позвольте мне знать, если это помогает.
ОБНОВИТЬ
Обратите внимание, что вы также можете переопределить 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;
}
}
Но я действительно не понимаю, почему кто-то захочет это сделать, поскольку база BottomSheetFragment
не делает ничего, кроме возврата BottomSheetDialog
.
ОБНОВЛЕНИЕ ДЛЯ ANDROIDX
При использовании AndroidX ресурс, ранее находившийся по адресу, android.support.design.R.id.design_bottom_sheet
теперь можно найти по адресу com.google.android.material.R.id.design_bottom_sheet
.
BottomSheetDialogFragment
дерганным (кажется, пропускает кадры в начальной анимации) при переходе от свернутого к расширенному поведению. Изменить: протестировано на устройствах Android Marshmallow и KitKat