ボトムにフッター的なものを固定したいときあるよね
これがCoordinatorLayoutだと下にちょっと隠れて辛い
これの解消方法
・前提
Activityのレイアウト
このViewPager2の中のFragmentにbottomで固定したViewを作りたい
<androidx.coordinatorlayout.widget.CoordinatorLayout> <com.google.android.material.appbar.AppBarLayout> <androidx.appcompat.widget.Toolbar /> </com.google.android.material.appbar.AppBarLayout> <androidx.viewpager2.widget.ViewPager2 app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </androidx.coordinatorlayout.widget.CoordinatorLayout>
・やりかた
behaviorを拡張する
これする頭全然なかった
<androidx.viewpager2.widget.ViewPager2 app:layout_behavior="パッケージ名.FixScrollingFooterBehavior" />
layoutDependsOnで監視する対象を指定
今回動くのはAppbarLayoutなので指定
onDependentViewChangedで対象が変更になったときに何するか記載
appBarの動く範囲と高さからpaddingいくつあてるか指定
これでFragmentに動的にpaddingがつくので一番下にViewを固定できましたとさ
class FixScrollingFooterBehavior : ScrollingViewBehavior { constructor() : super() {} constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {} override fun layoutDependsOn( parent: CoordinatorLayout, child: View, dependency: View ): Boolean { return dependency is AppBarLayout } override fun onDependentViewChanged( parent: CoordinatorLayout, child: View, dependency: View ): Boolean { val appBarLayout = dependency as AppBarLayout val result = super.onDependentViewChanged(parent, child, dependency) val bottomPadding = calculateBottomPadding(appBarLayout) val paddingChanged = bottomPadding != child.paddingBottom if (paddingChanged) { child.setPadding( child.paddingLeft, child.paddingTop, child.paddingRight, bottomPadding ) child.requestLayout() } return paddingChanged || result } private fun calculateBottomPadding(dependency: AppBarLayout): Int { val totalScrollRange = dependency.totalScrollRange return totalScrollRange + dependency.top } }
参考
https://stackoverflow.com/questions/37493215/fixed-view-in-viewpagers-content-layout-under-coordinatorlayout
https://techblog.yahoo.co.jp/android/androidcoordinatorlayout/