NestedScrollView嵌套WebView时WebView内部滚动失效问题
问题原因
这个滚动失效是两个原因共同导致的:
- 嵌套滚动冲突:外层
NestedScrollView默认会优先消费竖直方向的滚动事件,不会将触摸事件分发给内部的WebView - 高度配置问题:你给WebView设置了
wrap_content属性,会让WebView完全展开所有内容的高度,自身没有滚动窗口,自然不会触发内部滚动逻辑
解决方案
场景1:需要WebView独立滚动,有固定展示区域
- 修改布局中WebView的高度配置,替换
wrap_content为固定高度,或者用0dp加layout_weight来分配展示高度,保证WebView的展示高度小于内容高度,才有滚动空间 - 给WebView添加嵌套滚动属性,XML中修改如下:
<WebView android:id="@+id/widgets" android:layout_width="match_parent" android:layout_height="200dp" <!-- 替换为你需要的固定高度 --> android:nestedScrollingEnabled="true" />
- 在代码中给WebView设置触摸监听,触发滚动时让父布局不要拦截事件:
webView.setOnTouchListener { v, event -> when (event.action) { MotionEvent.ACTION_DOWN -> v.parent.requestDisallowInterceptTouchEvent(true) MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> v.parent.requestDisallowInterceptTouchEvent(false) } v.onTouchEvent(event) }
- 额外开启WebView基础配置保证页面正常加载:
webView.settings.apply { javaScriptEnabled = true domStorageEnabled = true }
场景2:不需要WebView独立滚动,整个页面统一由NestedScrollView滚动
如果你的需求是WebView高度完全自适应内容,所有滚动都交给外层NestedScrollView处理,直接给WebView添加以下属性即可:
<WebView android:id="@+id/widgets" android:layout_width="match_parent" android:layout_height="wrap_content" android:nestedScrollingEnabled="false" android:isScrollContainer="false" />
内容的提问来源于stack exchange,提问作者VladAys
相关产品推荐
相关产品推荐

