ScrollView里面的Android WebView只滚动scrollview
在我的应用程序中,我有一个ScrollView包含一些linearviews,一些textviews和一个Webview,然后其他线性布局等。问题是,WebView不滚动。 Scroll只在ScrollView上侦听。 有什么build议么??
<ScrollView > <TextView /> <WebView /> <-- this does not scroll <TextView /> </ScrollView >
这是解决scheme。 在线find。 我已经分类的WebView和我使用requestDisallowInterceptTouchEvent(true);
方法来让我的webview来处理滚动事件。
TouchyWebView.java
package com.mypackage.common.custom.android.widgets public class TouchyWebView extends WebView { public TouchyWebView(Context context) { super(context); } public TouchyWebView(Context context, AttributeSet attrs) { super(context, attrs); } public TouchyWebView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onTouchEvent(MotionEvent event){ requestDisallowInterceptTouchEvent(true); return super.onTouchEvent(event); } }
并在layout.xml中
<com.mypackage.common.custom.android.widgets.TouchyWebView android:id="@+id/description_web" android:layout_width="match_parent" android:layout_height="wrap_content" />
@panos提供的解决scheme工作,但它与ScrollView一起使用时仍然有问题。 以下增强版本克服了这个问题。
public class TouchyWebView extends WebView { public TouchyWebView(Context context) { super(context); } public TouchyWebView(Context context, AttributeSet attrs) { super(context, attrs); } public TouchyWebView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onTouchEvent(MotionEvent event) { //Check is required to prevent crash if (MotionEventCompat.findPointerIndex(event, 0) == -1) { return super.onTouchEvent(event); } if (event.getPointerCount() >= 2) { requestDisallowInterceptTouchEvent(true); } else { requestDisallowInterceptTouchEvent(false); } return super.onTouchEvent(event); } @Override protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) { super.onOverScrolled(scrollX, scrollY, clampedX, clampedY); requestDisallowInterceptTouchEvent(true); } }
另外,您可能需要为TouchyWebView进行以下设置。
mWebView.getSettings().setLoadWithOverviewMode(true); mWebView.getSettings().setUseWideViewPort(true); mWebView.getSettings().setSupportZoom(true); mWebView.getSettings().setBuiltInZoomControls(true);
Panos解决scheme对我来说是足够的,只有一个例外…我的固定高度(200dp)的WebView
可能是空的或可能已经加载了很多的内容。 所以它可能是或者可能不是可滚动的“本身”。 Panos解决scheme总是使用MotionEvent
,因此当WebView
为空时,用户触摸WebView
并尝试滚动,则WebView
将不会滚动(因为没有内容),并且可滚动的父项也会导致WebView
“吞下” MotionEvent
– 因此没有任何反应。 我已经添加了小的if
语句预期的行为:
@Override public boolean onTouchEvent(MotionEvent event) { if(computeVerticalScrollRange() > getMeasuredHeight()) requestDisallowInterceptTouchEvent(true); return super.onTouchEvent(event); }
- 当
WebView
为空而不是垂直滚动时,则computeVerticalScrollRange() == getMeasuredHeight()
- 当
WebView
内容长度超过其高度(可滚动),则computeVerticalScrollRange() > getMeasuredHeight()
您可以更改为3个布局:
- 第一个TextView – 标题
- WebView – 主要布局
- 第二个TextView – 页脚
WebView web = (WebView) findViewById(R.id.webView); View header = getLayoutInflater().inflate(R.layout.header_layout, null); View footer = getLayoutInflater().inflate(R.layout.foorer_layout, null); web.addHeaderView(headerComment); web.addFooterView(footerComment);