LoginSignup
1
0

More than 5 years have passed since last update.

CoordinatorLayoutに表示したSnackBarをスワイプで消せないようにする方法

Posted at

知らなかったんですが、CoordinatorLayoutにSnackBarを表示すると、左から右へスワイプで消せるんですね。
でも、消したくない!ってこともあるので、消さないようにする方法を調べて実際に消せないようにした

まずは消している実装を調べた

Snackbarが継承している BaseTransientBottomBar で以下のようなコードがあります。

    final void showView() {
        if (mView.getParent() == null) {
            final ViewGroup.LayoutParams lp = mView.getLayoutParams();

            if (lp instanceof CoordinatorLayout.LayoutParams) {
                // If our LayoutParams are from a CoordinatorLayout, we'll setup our Behavior
                final CoordinatorLayout.LayoutParams clp = (CoordinatorLayout.LayoutParams) lp;

                final Behavior behavior = new Behavior();
                behavior.setStartAlphaSwipeDistance(0.1f);
                behavior.setEndAlphaSwipeDistance(0.6f);
                behavior.setSwipeDirection(SwipeDismissBehavior.SWIPE_DIRECTION_START_TO_END);
                // 略
                clp.setBehavior(behavior);
                // Also set the inset edge so that views can dodge the bar correctly
                clp.insetEdge = Gravity.BOTTOM;
            }

            mTargetParent.addView(mView);
        }

Snackbarが使ってるViewのLayoutParamsがCoordinatorLayoutだったときだけ特別にBehaviorなるものを設定して、スワイプで消せるようにしてました。

消さないようにする方法

CoordinatorLayoutを使いながらも、スワイプで消さないようにするために、Behaviorを上書きするようにしました。

val snackBar = Snackbar.make(binding.coordinatorLayout, message.text, length).apply {
    addCallback(object : BaseTransientBottomBar.BaseCallback<Snackbar>() {
        override fun onShown(transientBottomBar: Snackbar) {
            super.onShown(transientBottomBar)
            val lp = transientBottomBar.view.layoutParams
            if (lp is CoordinatorLayout.LayoutParams) {
                lp.behavior = null
            }
        }
    })
}
snackBar.show()

addCallbackで、snackBarが表示出来た後にBehaviorを上書きしてます。 snackBar.show() の直後だと、 BaseTransientBottomBar.showViw() でBehaviorが上書きされてしまうのでスワイプで消えてしまいます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0