删除默认选择而不禁用 Web 视图的超链接和按钮

Posted

技术标签:

【中文标题】删除默认选择而不禁用 Web 视图的超链接和按钮【英文标题】:remove default selection without disabling web view's hyperlinks and buttons 【发布时间】:2015-03-04 01:08:00 【问题描述】:

我正在使用 btwebview 来获取文本选择并进行处理。问题是当我将 longPress 与gestureDetector 一起使用时,默认选择也会启动,如果我覆盖onTouchEvent 并返回true,问题就解决了,但我无法单击webview 上的任何按钮或突出显示的链接,因此我无法访问脚注或视频插入 webview 并且 shouldOverrideUrlLoading 停止被调用。

  public void init(Context context) 
    System.out.println("BTWebview init");
    this.context = context;
    this.getSettings().setjavascriptEnabled(true);
    gestureScanner = new GestureDetector(this);
    this.setOnTouchListener(new View.OnTouchListener() 

        public boolean onTouch(View v, MotionEvent event) 
            System.out.println("event "+event.toString() );
            return gestureScanner.onTouchEvent(event);
        
    );

    setInitialScale(100);
    addJavascriptInterface(new MyJavaScriptInterface(), "htmlOUT");



@Override
public boolean onTouchEvent(MotionEvent event) 
    System.out.print("on touch event "+ event.toString());
    return true;


@Override
public void onLongPress(MotionEvent e) 
    // TODO Auto-generated method stub
    // TODO Auto-generated method stub
            System.out.println("gesture listener onLongPress");

            mSelection = true;
            if(!this.isInSelectionMode())
                System.out.println("onLongClick in selection mode");
                mSelection = true;
            

            this.loadUrl("javascript:android.selection.longTouch();");
                mScrolling = true;
                System.out.println("onLongClick");


【问题讨论】:

【参考方案1】:

webview 停止响应触摸的原因是该功能是在超类的onTouchEvent 中实现的。

因此,要让它再次工作,您需要在您的 onTouchEvent 中的某处致电 super.onTouchEvent(event)。显然,总是调用它会让你回到你开始的地方。

要实现您想要做的事情,只有在您尚未检测到该事件是长按事件时,您才需要调用super.onTouchEvent。最简单的方法是存储来自MotionEvent 的指针ID,该ID 在onLongPress 中传递(您应该能够假设它将是索引0 处的指针,因为长按定义为单次触摸事件)。

一旦你有了这个,你的 onTouchEvent 可能看起来像这样

@Override
public boolean onTouchEvent(MotionEvent event) 
    if (event.getPointerId(0) != self.lastLongPressPointerId) 
        return super.onTouchEvent(event);
    
    return true;

您可能还需要注意与指针相关的 ACTION_UP 和 ACTION_CANCEL 事件,然后停止寻找它,以防系统决定重用指针 ID。

【讨论】:

很抱歉回复晚了,我已经尝试过您的建议,但没有奏效。当 onTouchEvent 被覆盖时的问题,就像您发布脚注链接和 webview 中的按钮停止工作的问题一样。我可以尝试的任何其他建议 你的逻辑是对的,但可能我犯了一些错误,我会再次修改,但谢谢你的想法。 event.getPointerId(0) 对于所有手势总是为零,我认为这是问题所在。还有其他方法可以检测到某个事件吗? 好的,我通过设置一个对动作进行倒计时的计数器找到了解决方案,如果它们大于 2,那么它是一个长按,我返回 true,否则返回 super.onTouchEvent(event)。

以上是关于删除默认选择而不禁用 Web 视图的超链接和按钮的主要内容,如果未能解决你的问题,请参考以下文章

Gmail 收件箱视图中的超链接(电子邮件内容)

【急】【狗不答问题】点击网页中的超链接按钮没用是怎么回事? 赏金:200

根据另一列值禁用jqgrid中的超链接

如何创建一个仅在 chrome 中打开并使用禁用标志的超链接

如何覆盖 wkwebview 超链接操作表

如何在jQGrid行中禁用超链接