【问题标题】:Android disable WebView touch but keep zooming/scrollingAndroid禁用WebView触摸但继续缩放/滚动
【发布时间】:2012-09-09 04:41:26
【问题描述】:

我正在寻找一种禁用 WebView 触摸的方法,这样用户就无法点击 html 链接,但可以保留 WebView 的缩放和滚动功能。

【问题讨论】:

    标签: android webview scroll touch zooming


    【解决方案1】:

    这是我的解决方案。它不会让用户触发 javascript 点击事件

    public class NonClickableWebView extends WebView {
        private GestureDetectorCompat gestureDetector;
        private boolean isSingleTap = false;
    
        public NonClickableWebView(Context context) {
            super(context);
            gestureDetector = new GestureDetectorCompat(context, new GestureDetector());
        }
    
        public NonClickableWebView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            gestureDetector = new GestureDetectorCompat(context, new GestureDetector());
        }
    
        public NonClickableWebView(Context context, AttributeSet attrs) {
            super(context, attrs);
            gestureDetector = new GestureDetectorCompat(context, new GestureDetector());
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                isSingleTap = false;
            }
            gestureDetector.onTouchEvent(event);
    
            if (isSingleTap && event.getAction() == MotionEvent.ACTION_UP) {
                return true;
            }
    
            return super.onTouchEvent(event);
        }
    
        private class GestureDetector extends android.view.GestureDetector.SimpleOnGestureListener {
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                isSingleTap = true;
                return false;
            }
    
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                isSingleTap = true;
                return false;
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      我一开始就使用了rattisuk的答案,但意识到如果你点击某个地方,点击会被拦截,但会变成长按,如果你点击了某个文本字段,手机会振动并且还会弹出一些潜在的版本菜单。 此外,只要在 web 视图中按下可更改的 UI 元素(例如单击链接或按钮),这些 UI 元素就会改变外观。 为了防止这种情况,这是我改进的解决方案:

      // Disable the haptic feedback so that handling the long click doesnt make the phone vibrate
      webview.setHapticFeedbackEnabled(false);
      // Intercept long click events so that they dont reach the webview
      webview.setOnLongClickListener(new OnLongClickListener() {
          @Override
          public boolean onLongClick(final View v) {
              return true;
          }
      });
      // Intercept any touch event not related to scrolling/zooming
      webview.setOnTouchListener(new View.OnTouchListener() {
          @Override
          public boolean onTouch(final View v, final MotionEvent event) {
              if (event.getAction() == MotionEvent.ACTION_DOWN) {
                  // Change ACTION_DOWN location to outside of the webview so that it doesnt affect 
                  // pressable element in the webview (buttons receiving PRESS" will change appearance)
                  event.setLocation(webview.getWidth() + 1, webview.getHeight() + 1);
              }
              // Intercept any "up" event
              return event.getAction() == MotionEvent.ACTION_UP;
          }
      });
      

      【讨论】:

      • 感谢@androidseb,它帮助我禁用了所有触摸功能,但滚动
      【解决方案3】:

      下面的代码允许你滚动,但是当点击链接时它不会转到下一页。

      webView.setLongClickable(false);
      
      webView.setOnTouchListener(new View.OnTouchListener()
      {
      
        @Override
      
        public boolean onTouch(View arg0, MotionEvent arg1)
        {
      
             return arg1.getAction() == MotionEvent.ACTION_UP;
      
        }
      }
      
      );
      

      【讨论】:

        【解决方案4】:
        Webview.setWebViewClient(new WebViewClient(){
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {      
                            return false;
                }
        });
        

        【讨论】:

        • 这不会影响用户对 WebView 的点击。这只是让我的应用导航到链接,而无需转到默认浏览器。
        • 我认为答案是正确的,除了你想返回 true 而不是 false 以表明你将在你的主机应用程序中处理 url 加载。
        • 返回 true 将打开默认浏览器中按下的任何链接。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-07
        • 2018-11-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多