知らなかったんですが、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が上書きされてしまうのでスワイプで消えてしまいます。