標準の android BottomSheetBehavior には、非表示、折りたたみ、および展開のツリー状態があります。
ユーザーが折りたたまれた状態と展開された状態の間で一番下のシートを「離れる」ことができるようにしたい。現在、デフォルトの動作では、最も近い折りたたみまたは展開ベースにスナップします。このスナップ機能を無効にするにはどうすればよいですか?
標準の android BottomSheetBehavior には、非表示、折りたたみ、および展開のツリー状態があります。
ユーザーが折りたたまれた状態と展開された状態の間で一番下のシートを「離れる」ことができるようにしたい。現在、デフォルトの動作では、最も近い折りたたみまたは展開ベースにスナップします。このスナップ機能を無効にするにはどうすればよいですか?
View
を拡張するためにそのような機能を実現する方法を紹介しBottomSheetDialogFragment
ます。
拡大する:
まずオーバーライドしonResume
ます:
@Override
public void onResume() {
super.onResume();
addGlobaLayoutListener(getView());
}
private void addGlobaLayoutListener(final View view) {
view.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
setPeekHeight(v.getMeasuredHeight());
v.removeOnLayoutChangeListener(this);
}
});
}
public void setPeekHeight(int peekHeight) {
BottomSheetBehavior behavior = getBottomSheetBehaviour();
if (behavior == null) {
return;
}
behavior.setPeekHeight(peekHeight);
}
上記のコードがすべきことはBottomSheet
peekHeight
、 をビューの高さに設定するだけです。ここで重要なのは関数getBottomSheetBehaviour()
です。実装は以下です。
private BottomSheetBehavior getBottomSheetBehaviour() {
CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) ((View) getView().getParent()).getLayoutParams();
CoordinatorLayout.Behavior behavior = layoutParams.getBehavior();
if (behavior != null && behavior instanceof BottomSheetBehavior) {
((BottomSheetBehavior) behavior).setBottomSheetCallback(mBottomSheetBehaviorCallback);
return (BottomSheetBehavior) behavior;
}
return null;
}
これは、親にView
「CoordinatorLayout.LayoutParams」が設定されているかどうかを確認するだけです。はいの場合、適切に設定BottomSheetBehavior.BottomSheetCallback
し (次の部分で必要になります)、さらに重要なCoordinatorLayout.Behavior
ことに、 であるはずの を返しますBottomSheetBehavior
。
崩壊:
ここに [`BottomSheetBehavior.BottomSheetCallback.onSlide (View bottomSheet, float slideOffset)`]( https://developer.android.com/reference/android/support/design/widget/BottomSheetBehavior.BottomSheetCallback.html#onSlide(android. view.View、 float)) はまさに必要なものです。[ドキュメント]( https://developer.android.com/reference/android/support/design/widget/BottomSheetBehavior.BottomSheetCallback.html#onSlide(android.view.View , float)) から:
このボトムシートが上に移動するにつれて、オフセットが増加します。0 から 1 までは、シートは折りたたまれた状態と展開された状態の間であり、-1 から 0 までは、非表示の状態と折りたたまれた状態の間です。
つまり、崩壊検出には 2 番目のパラメーターをチェックするだけで済みます。
BottomSheetBehavior.BottomSheetCallback
同じクラスで定義します。
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) {
if (slideOffset < 0) {
dismiss();
}
}
};