0

ViewPager2端から端まで移動するときにウィンドウのインセットを尊重する必要があるFragmentにFABがあります。OnApplyWindowInsetsListenerマージンを更新する FAB に を追加しています。古い を使用する場合、これは正常に機能しViewPagerます。

に更新すると、最初は呼び出されないViewPager2ようです。OnApplyWindowInsetsListenerしかし、私がActionMode. 次に、リスナーが呼び出され、親 Fragment を離れるまで新しいマージンが使用されます。


問題を説明するためにデモ プロジェクトをフォークしました。https://github.com/hardysim/views-widgets-samples/tree/edge-to-edgeParallelNestedScrollingActivityのブランチedge-to-edgeにある「ネストされた RecyclerViews を使用した ViewPager2」の例 ( ) を参照してください。

ここでは、ViewPager2 ページで使用される (ネストされた) に FAB を追加しRecyclerView、Activity-UI をエッジ ツー エッジに設定しました (「参考文献」を参照View.goEdgeToEdge())。次に、FAB はナビゲーション バーの背後にあり、そのマージンを更新してウィンドウ インセットを追加する必要があります。

そして、これは機能していない場所です(ただし、古い では問題なく機能しますViewPager)。

4

2 に答える 2

1

ViewPager2実装バグのようです。ページャーが作成したビューを初めて取得すると、ページャーはrequestApplyInsetsそれを呼び出します。しかし、残念ながら、ビューは親ビューをアタッチしていないため、 の呼び出しはrequestApplyInsets効果がありません。

View.OnAttachStateChangeListenerにwhich 呼び出しrequestApplyInsetsを追加することで解決できますonViewAttachedToWindow

あなたのParallelNestedScrollingActivityサンプルは次のようにうまく機能しているようです:

diff --git a/ViewPager2/app/src/main/java/androidx/viewpager2/integration/testapp/ParallelNestedScrollingActivity.kt b/ViewPager2/app/src/main/java/androidx/viewpager2/integration/testapp/ParallelNestedScrollingActivity.kt
index 4e3753a..d2683df 100644
--- a/ViewPager2/app/src/main/java/androidx/viewpager2/integration/testapp/ParallelNestedScrollingActivity.kt
+++ b/ViewPager2/app/src/main/java/androidx/viewpager2/integration/testapp/ParallelNestedScrollingActivity.kt
@@ -29,0 +30 @@ import android.widget.TextView
+import androidx.core.view.ViewCompat
@@ -57 +58,3 @@ class ParallelNestedScrollingActivity : Activity() {
-            val root = inflater.inflate(R.layout.item_nested_recyclerviews, parent, false)
+            val root = inflater.inflate(R.layout.item_nested_recyclerviews, parent, false).apply {
+                addOnAttachStateChangeListener(RequestApplyInsetsOnAttached)
+            }
@@ -132,0 +136,5 @@ internal val CELL_COLORS = listOf(
+
+private object RequestApplyInsetsOnAttached : View.OnAttachStateChangeListener {
+    override fun onViewAttachedToWindow(view: View) = ViewCompat.requestApplyInsets(view)
+    override fun onViewDetachedFromWindow(view: View) = Unit
+}
于 2020-05-19T17:49:31.323 に答える