How to disable horizontal scrolling in Android webview

前端 未结 8 513
星月不相逢
星月不相逢 2020-12-24 09:53

I want to have only vertical scrolling in my webview and don\'t want any horizontal scrolling.

webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);

相关标签:
8条回答
  • 2020-12-24 09:57

    I know its late but i hope it will help someone, please use the class mentioned below in-order to disable horizontal scroll.

    public class CustomWebView extends WebView implements View.OnTouchListener {
    
        // the initial touch points x coordinate
        private float touchDownX;
        private OnScrollChangedCallback mOnScrollChangedCallback;
    
        public CustomWebView(final Context context) {
            super(context);
    
            // make vertically scrollable only
            makeVerticalScrollOnly();
        }
    
        public CustomWebView(final Context context, final AttributeSet attrs) {
            super(context, attrs);
    
            // make vertically scrollable only
            makeVerticalScrollOnly();
        }
    
        public CustomWebView(final Context context, final AttributeSet attrs, final int defStyle) {
            super(context, attrs, defStyle);
    
            // make vertically scrollable only
            makeVerticalScrollOnly();
        }
    
        @Override
        protected void onScrollChanged(final int l, final int t, final int oldl, final int oldt) {
            super.onScrollChanged(l, t, oldl, oldt);
            if (mOnScrollChangedCallback != null) mOnScrollChangedCallback.onScroll(l, t);
        }
    
        public OnScrollChangedCallback getOnScrollChangedCallback() {
            return mOnScrollChangedCallback;
        }
    
        public void setOnScrollChangedCallback(final OnScrollChangedCallback onScrollChangedCallback) {
            mOnScrollChangedCallback = onScrollChangedCallback;
        }
    
        /**
         * Impliment in the activity/fragment/view that you want to listen to the webview
         */
        public static interface OnScrollChangedCallback {
            public void onScroll(int l, int t);
        }
    
        /**
         * make this {@link WebView} vertically scroll only
         */
        private void makeVerticalScrollOnly() {
            // set onTouchListener for vertical scroll only
            setOnTouchListener(this);
    
            // hide horizontal scroll bar
            setHorizontalScrollBarEnabled(false);
        }
    
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
    
            // multitouch is ignored
            if (motionEvent.getPointerCount() > 1) {
                return true;
            }
    
            // handle x coordinate on single touch events
            switch (motionEvent.getAction()) {
                // save the x coordinate on touch down
                case MotionEvent.ACTION_DOWN:
                    touchDownX = motionEvent.getX();
                    break;
    
                // reset the x coordinate on each other touch action, so it doesn't move
                case MotionEvent.ACTION_MOVE:
                case MotionEvent.ACTION_CANCEL:
                case MotionEvent.ACTION_UP:
                    motionEvent.setLocation(touchDownX, motionEvent.getY());
                    break;
    
            }
    
            // let the super view handle the update
            return false;
    
        }
    }
    
    0 讨论(0)
  • 2020-12-24 09:58
     webView.setHorizontalScrollBarEnabled(false);
    

    Define whether the horizontal scrollbar should be drawn or not. The scrollbar is not drawn by default.

    0 讨论(0)
  • 2020-12-24 10:01

    Solution based on @vee answer, but more convenient:

    public class WebViewTouchListener implements View.OnTouchListener {
        private float downX;
    
        @Override
        public boolean onTouch(final View v, final MotionEvent event) {
            if (event.getPointerCount() > 1) {
                //multi touch
                return true;
            }
    
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    downX = event.getX();
                    break;
                case MotionEvent.ACTION_MOVE:
                case MotionEvent.ACTION_CANCEL:
                case MotionEvent.ACTION_UP:
                    // set x so that it doesn't move
                    event.setLocation(downX, event.getY());
                    break;
            }
            return false;
        }
    }
    

    And just use it with a WebView:

     webView.setHorizontalScrollBarEnabled(false);
     webView.setOnTouchListener(new WebViewTouchListener());
    
    0 讨论(0)
  • 2020-12-24 10:03

    I just tried this and it worked like a charm, I didn't know it's this simple, just one line:

    mWebView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
    

    Source: http://sharecoding.wordpress.com/2012/02/16/programmatically-disable-scroll-function-on-android-webview/

    0 讨论(0)
  • 2020-12-24 10:08

    This is a hack, but one that has worked for me successfully in the past. Surround your WebView in a vertically oriented ScrollView:

    <ScrollView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:scrollbars="vertical"    >
      <WebView
        android:id="@+id/mywebview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
    </ScrollView>
    

    and then disable all scrolling in your WebView.

    To disable your WebView's scrolling, you can use this code:

     // disable scroll on touch
    webview.setOnTouchListener(new View.OnTouchListener() {
    
        public boolean onTouch(View v, MotionEvent event) {
          return (event.getAction() == MotionEvent.ACTION_MOVE);
        }
    });
    
    0 讨论(0)
  • 2020-12-24 10:11

    Here is how I disable horizontal scrolling only for a webview.

    webView.setHorizontalScrollBarEnabled(false);
    webView.setOnTouchListener(new View.OnTouchListener() {
        float m_downX;
        public boolean onTouch(View v, MotionEvent event) {
    
            if (event.getPointerCount() > 1) {
                //Multi touch detected
                return true;
            }
    
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    // save the x
                    m_downX = event.getX();
                    break;
                }
                case MotionEvent.ACTION_MOVE:
                case MotionEvent.ACTION_CANCEL:
                case MotionEvent.ACTION_UP: {
                    // set x so that it doesn't move
                    event.setLocation(m_downX, event.getY());
                    break;
                }
    
            }
            return false;
        }
    });
    

    Basically intercept the touch event and don't allow the x value to change. This allows the webview to scroll vertically but not horizontally. Do it for y if you want the opposite.

    0 讨论(0)
提交回复
热议问题