"Należy pamiętać, że nie można wywołać metody przed układem widoku." < --- To jest wskazówka.
W dialogach znajduje się detektor, który jest uruchamiany po wyświetleniu okna dialogowego . Nie można wyświetlić okna dialogowego, jeśli nie jest ono ułożone.
Więc w onCreateDialog() swojego modalnej prześcieradło (BottomSheetFragment), tuż przed powrotem do okna dialogowego (lub gdziekolwiek, skoro masz odniesienie do okna), zadzwoń:
// 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);
}
});
W moim Przypadek mój niestandardowy BottomSheet okazał się być:
@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.
UPDATE
pamiętać, że można również zastąpić BottomSheetDialogFragment
jak:
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;
}
}
ale ja naprawdę nie rozumiem, dlaczego ktoś chciałby to zrobić jako doesnt baza BottomSheetFragment zrobić coś innego niż zwróci BottomSheetDialog
Dzięki, próbowałem tej metody.To sprawia, że 'BottomSheetDialogFragment' wygląda jak jankowy (wydaje się pomijać klatki w animacji otwierającej), gdy przechodzi od zwiniętego do rozwiniętego zachowania. Edycja: Przetestowano to na urządzeniach Android Marshmallow i KitKat – user2560886
Działa to idealnie dla mnie. Bez przeskakiwania. Czy robisz cokolwiek innego poza właśnie zwróceniem okna dialogowego? Będziemy wdzięczni, jeśli zaktualizujesz swój post za pomocą kodu, dzięki czemu będę mógł mieć lepszy pomysł. – efemoney
Nie zauważam żadnego szarpnięcia; działa dobrze. – rpattabi