"Зверніть увагу, що ви не можете викликати метод перед макетами подання."
Наведений текст є підказкою.
Діалоги мають прослуховувач, який запускається, коли діалогове вікно відображається . Діалогове вікно неможливо показати, якщо воно не розкладене.
Отже, у 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
не робить нічого, крім повернення a BottomSheetDialog
.
ОНОВЛЕННЯ ДЛЯ ANDROIDX
При використанні AndroidX ресурс, який раніше знаходився за адресою, android.support.design.R.id.design_bottom_sheet
тепер можна знайти за адресою com.google.android.material.R.id.design_bottom_sheet
.
BottomSheetDialogFragment
вигляд незграбним (здається, пропускає кадри в початковій анімації), коли він переходить від згорнутого до розширеного. Редагувати: Тестував це на пристроях Android Marshmallow та KitKat