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个布局:

  1. 第一个TextView – 标题
  2. WebView – 主要布局
  3. 第二个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);