BottomSheet Dialogを実装しました。ユーザーがボトムシートの外側をタッチしたときにボトムシートが消えないようにしたいです(完全に展開されていない状態)。
コードでdialog.setCanceledOnTouchOutside(false);
を設定しましたが、何の影響もありません。
これが私のBottomSheetDialogFragmentクラスです。
public class ShoppingCartBottomSheetFragment extends BottomSheetDialogFragment {
private BottomSheetBehavior.BottomSheetCallback mBottomSheetBehaviorCallback = new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
if (newState == BottomSheetBehavior.STATE_HIDDEN) {
dismiss();
}
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
}
};
@Override
public void setupDialog(Dialog dialog, int style) {
super.setupDialog(dialog, style);
View contentView = View.inflate(getContext(), R.layout.fragment_shopping_cart_bottom_sheet, null);
dialog.setCanceledOnTouchOutside(false);
dialog.setContentView(contentView);
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) ((View) contentView.getParent()).getLayoutParams();
CoordinatorLayout.Behavior behavior = params.getBehavior();
if( behavior != null && behavior instanceof BottomSheetBehavior ) {
((BottomSheetBehavior) behavior).setBottomSheetCallback(mBottomSheetBehaviorCallback);
((BottomSheetBehavior) behavior).setPeekHeight(97);
((BottomSheetBehavior) behavior).setHideable(false);
}
}
@Override
public void onStart() {
super.onStart();
Window window = getDialog().getWindow();
WindowManager.LayoutParams windowParams = window.getAttributes();
windowParams.dimAmount = 0;
windowParams.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
window.setAttributes(windowParams);
}
}
BottomSheetによると、 specification ボトムシートは、ボトムシートの外側に触れると閉じることができます。したがって、この動作をオーバーライドし、閉じられないようにするためのオプションは何ですか。
インスタンスを作成するときは、#setCancelable(false)
を使用する必要があります。
BottomSheetDialogFragment bottomSheetDialogFragment = new SequenceControlFragmentBottomSheet();
bottomSheetDialogFragment.setCancelable(false);
bottomSheetDialogFragment.show(getChildFragmentManager(), bottomSheetDialogFragment.getTag());
setCancelable(false)
は、バックプレスでもボトムシートが消えないようにします。 Androidデザインサポートライブラリ)の一番下のシートのレイアウトリソースを見ると、ID _touch_outside
_のViewコンポーネントがあり、OnClickListener
がありますwrapInBottomSheet
のメソッドBottomSheetDialog
で設定し、外部のクリックを検出してダイアログを閉じるために使用されるので、ボトムシートの外側でタッチがキャンセルされないようにするには、OnClickListener
を削除する必要があります。
これらの行をonActivityCreated
メソッド(またはonCreateView
の後の他のライフサイクルメソッド)に追加します。
_@Override public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
View touchOutsideView = getDialog().getWindow()
.getDecorView()
.findViewById(Android.support.design.R.id.touch_outside);
touchOutsideView.setOnClickListener(null);
}
_
また、下にスワイプして下のシートが消えないようにするには、下のシートダイアログの動作を変更しますHideable false。 setHideable(false)
するには、次のコードをonCreateDialog
メソッドに追加します。
_@Override public Dialog onCreateDialog(Bundle savedInstanceState) {
final BottomSheetDialog bottomSheetDialog =
(BottomSheetDialog) super.onCreateDialog(savedInstanceState);
bottomSheetDialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override public void onShow(DialogInterface dialog) {
FrameLayout bottomSheet =
bottomSheetDialog.findViewById(Android.support.design.R.id.design_bottom_sheet);
if (null != bottomSheet) {
BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);
behavior.setHideable(false);
}
}
});
return bottomSheetDialog;
}
_