«Обратите внимание, что вы не можете вызвать метод перед макетами просмотра». < --- Это ключ.
Диалоги имеют слушатель, который запускается после того, как диалог показан. Диалог не может быть показан, если он не выложен.
Так, в onCreateDialog() ваш модального нижнего лист (BottomSheetFragment), как раз перед возвращением диалога (или где-нибудь, когда у вас есть ссылка на диалог), звоните:
// This listener's onShow is fired when the dialog is shown
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
// In a previous life I used this method to get handles to the positive and negative buttons
// of a dialog in order to change their Typeface. Good ol' days.
BottomSheetDialog d = (BottomSheetDialog) dialog;
// This is gotten directly from the source of BottomSheetDialog
// in the wrapInBottomSheet() method
FrameLayout bottomSheet = (FrameLayout) d.findViewById(android.support.design.R.id.design_bottom_sheet);
// Right here!
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;
}
}
Дайте мне знать, если это поможет.
UPDATE
Обратите внимание, что вы можете также переопределить 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);
}
});
// Do something with your dialog like setContentView() or whatever
return dialog;
}
}
, но я действительно не понимаю, почему кто-то хочет сделать это как база BottomSheetFragment не делает ничего, кроме возвращать BottomSheetDialog
Спасибо, я попробовал этот метод.Это заставляет «BottomSheetDialogFragment» казаться janky (кажется, пропускает кадры в анимации открытия), поскольку он идет от сложенного к расширенному поведению. Редактировать: Протестировано на устройствах Marshmallow и KitKat Android. – user2560886
Он отлично работает для меня. Нет пропусков. Вы делаете что-нибудь еще, кроме как только возвращаете диалог? Поймите, если вы обновите свой пост с помощью своего кода, чтобы я мог получить лучшую идею. – efemoney
Я не замечаю никакого удара; работает просто отлично. – rpattabi