2017-11-13 4 views
0

したがって、コールバックのカスタマイズと定型的なコードを除いて基本的に何もしないカスタムクラスを作成しました。何らかの理由で、ボトムシートの範囲外に触れるとキャンセルできないようです。私が試したカスタムBottomSheetDialogクラスを使用するとキャンセルできません。

public class CustomBottomSheetDialog extends AppCompatDialog { 

public CustomBottomSheetDialog(Context context) { 
    super(context, R.style.Theme_Design_Light_BottomSheetDialog); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 
} 

@Override 
public void setContentView(View view) { 
    final CoordinatorLayout coordinator = (CoordinatorLayout) View.inflate(getContext(), 
      R.layout.design_bottom_sheet_dialog, null); 
    FrameLayout bottomSheet = (FrameLayout) coordinator.findViewById(R.id.design_bottom_sheet); 
    BottomSheetBehavior.from(bottomSheet).setBottomSheetCallback(mBottomSheetCallback); 
    bottomSheet.addView(view); 
    super.setContentView(coordinator); 
} 

private BottomSheetBehavior.BottomSheetCallback mBottomSheetCallback = new BottomSheetBehavior.BottomSheetCallback() { 
    @Override 
    public void onStateChanged(View bottomSheet, int newState) { 
     if (newState == BottomSheetBehavior.STATE_HIDDEN) { 
      cancel(); // The only not boilerplate code here, woo 
     } 
    } 

    @Override 
    public void onSlide(View bottomSheet, float slideOffset) { } 
}; 

もの:

bottomSheetDialog.setCancelable(真の);
bottomSheetDialog.setCanceledOnTouchOutside(true);
dispatchTouchEventをオーバーライドしますが、画面全体のサイズ以外の矩形を取得できません。
カスタムクラスを使用しない場合(つまり、単にBottomSheetDialogだけのCustomBottomSheetDialog呼び出しを変更する場合)、私は外部のタッチでキャンセルを取得しますが、ドラッグしてダイアログを非表示にするとキャンセルされません持つ必要があります。

答えて

0

最後にそれを得ました。 onCreateでは、touch_outsideビューを見つけてクリックリスナーを追加してダイアログをキャンセルするコードを1行追加しました。 touch_outsideビューはデフォルトで生成されます。ボトムシートのXMLに追加する必要はありませんでした。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    findViewById(R.id.touch_outside).setOnClickListener(v -> cancel()); // <--- this guy 
    getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 
} 

ありがとう、this tutorialに行きます。

関連する問題