Android WebView inside ScrollView scrolls only scrollview

前端 未结 7 538
無奈伤痛
無奈伤痛 2020-11-27 02:26

In my app I have a ScrollView that contains some linearviews, some textviews and One Webview, then other linear layouts etc. The problem is that the WebView does not scroll.

相关标签:
7条回答
  • 2020-11-27 03:06

    The solution provided by @panos works but it still has issues when used with ScrollView. The following enhanced version overcomes that problem.

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

    Additionally, you might want to have the following settings for your TouchyWebView.

    mWebView.getSettings().setLoadWithOverviewMode(true);
    mWebView.getSettings().setUseWideViewPort(true);
    mWebView.getSettings().setSupportZoom(true);
    mWebView.getSettings().setBuiltInZoomControls(true);
    
    0 讨论(0)
  • 2020-11-27 03:11

    Here is the solution. Found online. I have subclassed WebView and i'm using the requestDisallowInterceptTouchEvent(true); method to allow my webview to handle the scroll event.

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

    And in layout.xml

    <com.mypackage.common.custom.android.widgets.TouchyWebView 
                    android:id="@+id/description_web"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                     />
    
    0 讨论(0)
  • 2020-11-27 03:14

    still happens in react-native-webview, issue tracked here https://github.com/react-native-community/react-native-webview/issues/22

    0 讨论(0)
  • 2020-11-27 03:17

    Just add one line in class file

    mWebview.setNestedScrollingEnabled(true);
    

    or add in Webview tag in XML

    android:nestedScrollingEnabled="true"
    

    Warning: only for API 21 and 21+

    0 讨论(0)
  • 2020-11-27 03:22

    You can change into 3 layouts:

    1. First TextView - header
    2. WebView - main layout
    3. Second TextView - footer


    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);
    
    0 讨论(0)
  • 2020-11-27 03:25

    Panos solution is sufficient for me with one exception... My fixed-height (200dp) WebView may be empty or may have loaded lot of content. So it may be or may be not scrollable "itself". Panos solution is consuming MotionEvents always, so when WebView is empty and user touch WebView and try to scroll then WebView will not scroll (because there is no content) and scrollable parent also, cause WebView "swallows" MotionEvent - so nothing happens. I've added small if statement for expected behaviour:

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if(computeVerticalScrollRange() > getMeasuredHeight())
            requestDisallowInterceptTouchEvent(true);
        return super.onTouchEvent(event);
    }
    
    • when WebView is empty and not-vertical-scrollable then computeVerticalScrollRange() == getMeasuredHeight()
    • when WebView have content longer than its height (is scrollable) then computeVerticalScrollRange() > getMeasuredHeight()
    0 讨论(0)
提交回复
热议问题