„Pamiętaj, że nie możesz wywołać metody przed wyświetlaniem układów”.
Powyższy tekst jest wskazówką.
Dialogi mają słuchacza, który jest zwolniony kiedy zostanie okno dialogowe pokazane . Nie można wyświetlić okna dialogowego, jeśli nie jest ustawione.
Tak więc w onCreateDialog()
twoim modalnym arkuszu dolnym ( BottomSheetFragment
), tuż przed zwróceniem okna dialogowego (lub gdziekolwiek, gdy masz odniesienie do okna dialogowego), wywołaj:
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);
}
});
W moim przypadku mój zwyczaj BottomSheet
okazał się:
@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;
}
}
Daj mi znać, jeśli to pomoże.
AKTUALIZACJA
Pamiętaj, że możesz również zastąpić BottomSheetDialogFragment
jako:
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;
}
}
Ale naprawdę nie rozumiem, dlaczego ktokolwiek miałby chcieć to zrobić, ponieważ baza BottomSheetFragment
nie robi nic poza zwracaniem pliku BottomSheetDialog
.
AKTUALIZACJA DLA ANDROIDX
Podczas korzystania z AndroidX zasób znaleziony wcześniej pod adresem android.support.design.R.id.design_bottom_sheet
można teraz znaleźć pod adresem com.google.android.material.R.id.design_bottom_sheet
.
BottomSheetDialogFragment
wygląda to dziwnie (wydaje się, że pomija klatki w animacji początkowej) podczas przechodzenia od zwiniętego do rozwiniętego zachowania. Edycja: przetestowano to na urządzeniach z Androidem Marshmallow i KitKat