Kotlinを勉強している中で、SwipeRefreshLayout
とScrollView
を同時に使用した際に、スクロールが競合してしまう現象が発生しました。
解決できたので、備忘録として記録しておきます。
結論
ScrollView
をNestedScrollView
に置き換えた。
経緯
冒頭で書いた通り、SwipeRefreshLayout
とScrollView
を同時に使用した際に、スクロールが競合してしまいました。
SwipeRefreshLayout
とかScrollView
ってなんや?という方は、ここでは省略させていただきますので、別途調べていただけると幸いです。
- 具体的に何が起きたか?
レイアウトの都合上、SwipeRefreshLayout
の入れ子でScrollView
を配置していました。
ところが…
ScrollView
の領域でも、上から下にスワイプをすると、SwipeRefreshLayout
の機能のほうが優先されて動いてしまい、ScrollView
のスクロールが一方通行になってしまっていました。
解決
ドラえもんよろしくChatGPTに泣きついたところ、
「NestedScrollView
を使いなさい」
と教えてもらいました。
NestedScrollViewとは(以下ChatGPTより引用)
NestedScrollView
は、Androidのサポートライブラリの一部であるScrollView
の拡張版です。NestedScrollView
は内部的にネスト可能なスクロール動作をサポートしているため、複数のスクロール可能なビューが組み合わさっている(つまり、ネストされている)場合でも適切に動作します。これは特に、スクロール可能な子ビューが含まれるCoordinatorLayout
などのコンテキストで便利です。
NestedScrollView
は以下のように使用します:
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Child views here -->
</androidx.core.widget.NestedScrollView>`
NestedScrollView
は1つの直接の子ビューのみをサポートします。そのため、複数のビューをスクロールする必要がある場合は、それらのビューをLinearLayout
やRelativeLayout
などのビューグループに包む必要があります。
NestedScrollView
は、スクロールイベントを親ビューと共有することをサポートしているため、スクロールイベントに応じて他のビュー(例えば、AppBarLayout
)の動作を変更したい場合に特に便利です。
ただし、大量のビューまたは非常に大きなビュー階層をスクロール可能にする場合は、代わりに
RecyclerView
を使用することを検討してください。RecyclerView
は、画面外のビューを再利用することでメモリ効率を大幅に向上させることができます。
====引用ここまで====
言われたと通り、ScrollView
をNestedScrollView
に置き換えてみると…
う、動く!!動くぞ!!
きちんと入れ子部分を上下にスクロールすることができました。
置き換えるだけで動くようになるとは……これは助かりますね!
締め
まだKotlinを触り始めたばかりで、
「何でそうなるの??!」「さっぱりわからん」
ということが多いですが、触りながら学びながら、もっとグリグリといじれるようになっていきたいです。
スクロールの競合について、どなたかの助けになれば幸いです。
ではまた。