滚动型滚动只是滚动里面的Android的WebView(Android WebView inside

2019-06-18 22:50发布

在我的应用我有一个包含一些linearviews滚动型,一些textviews和一个网页视图,那么其他的线性布局等问题是web视图不会滚动。 滚动侦听只在滚动型。 有什么建议??


<ScrollView >
    <TextView />
    <WebView />              <-- this does not scroll
    <TextView />
</ScrollView >

Answer 1:

这里是解决方案。 在网上找到。 我有子类的WebView和我使用requestDisallowInterceptTouchEvent(true); 方法让我的web视图处理滚动事件。

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"
                 />


Answer 2:

该解决方案由@panos作品提供但滚动型使用时,它仍然有问题。 下面的增强版本克服了这个问题。

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);


Answer 3:

帕诺斯的解决办法是有一个例外够我...我的固定高度(200dp) WebView可能为空或可能已经装载很多的内容。 因此,它可能是或可能是不可滚动的“本身”。 帕诺斯液消耗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()


Answer 4:

工作过@Panos和@Dipendra的解决方案,我仍然有一些问题,滚动型内一个MapView。 它不会持续垂直滚动,并已废弃的方法,所以我计算出这一招我MapView。使用scrollviews内部伟大工程。 我希望这可以帮助你们几个。

public class TouchyWebView extends WebView {
ViewParent mViewParent;

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);
}

public void setViewParent(@Nullable final ViewParent viewParent) { //any ViewGroup
    mViewParent = viewParent;
}


@Override
public boolean onTouchEvent(MotionEvent event) {

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if (null == mViewParent) {
                getParent().requestDisallowInterceptTouchEvent(true);
            } else {
                mViewParent.requestDisallowInterceptTouchEvent(true);
            }
            break;
        case MotionEvent.ACTION_UP:
            if (null == mViewParent) {
                getParent().requestDisallowInterceptTouchEvent(false);
            } else {
                mViewParent.requestDisallowInterceptTouchEvent(false);
            }
            break;
        default:
            break;
    }
    return super.onTouchEvent(event);
}

@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
    super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
    requestDisallowInterceptTouchEvent(true);


}

}

我也跟着关于设置控件@Dipendra建议。

mWebView.getSettings().setLoadWithOverviewMode(true);
mWebView.getSettings().setUseWideViewPort(true);
mWebView.getSettings().setSupportZoom(true);
mWebView.getSettings().setBuiltInZoomControls(true);


Answer 5:

您可以更改为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);


文章来源: Android WebView inside ScrollView scrolls only scrollview