"Lưu ý rằng bạn không thể gọi phương thức trước khi xem bố cục."
Văn bản trên là manh mối.
Hộp thoại có một trình nghe được kích hoạt sau khi hộp thoại được hiển thị . Hộp thoại không thể được hiển thị nếu nó không được bố trí.
Vì vậy, trong onCreateDialog()
trang dưới cùng phương thức của bạn ( BottomSheetFragment
), ngay trước khi trả lại hộp thoại (hoặc bất kỳ nơi nào, khi bạn có tham chiếu đến hộp thoại), hãy gọi:
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);
}
});
Trong trường hợp của tôi, tùy chỉnh của tôi BottomSheet
hóa ra là:
@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;
}
}
Hãy cho tôi biết nếu điều này sẽ giúp.
CẬP NHẬT
Lưu ý rằng bạn cũng có thể ghi đè BottomSheetDialogFragment
thành:
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;
}
}
Nhưng tôi thực sự không hiểu tại sao mọi người lại muốn làm điều đó vì cơ sở BottomSheetFragment
không làm bất cứ điều gì khác ngoài việc trả về a BottomSheetDialog
.
CẬP NHẬT CHO ANDROIDX
Khi sử dụng AndroidX, tài nguyên được tìm thấy trước đây tại android.support.design.R.id.design_bottom_sheet
hiện có thể được tìm thấy tại com.google.android.material.R.id.design_bottom_sheet
.
BottomSheetDialogFragment
vẻ buồn tẻ (dường như bỏ qua các khung hình trong hoạt ảnh mở đầu) khi nó chuyển từ hành vi thu gọn sang mở rộng. Chỉnh sửa: Đã kiểm tra điều này trên thiết bị Android Marshmallow và KitKat