Android - 长按以打开TextView上下文菜单也会触发自动链接点击

时间:2014-12-10 03:02:09

标签: android textview long-press android-contextmenu autolink

我有一个启动上下文菜单的TextView:

textView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
            @Override
            public void onCreateContextMenu(ContextMenu contextMenu, 
                                            View view,
                                            ContextMenu.ContextMenuInfo contextMenuInfo) {
                // Do stuff... 
            }
        });

此textview还在其XML中设置了android:autoLink="all"属性。

现在,如果我将TextView的内容设置为URL并长按URL,则首先显示上下文菜单,但是当我抬起手指时,按下链接并打开浏览器。

有没有办法让上下文菜单或长按消耗触摸事件,以便不点击链接?我已考虑覆盖onTouch()以使TextView处理ACTION_UP事件,但我无法可靠地跟踪上下文菜单何时可见以阻止触摸事件。

3 个答案:

答案 0 :(得分:2)

这对我来说似乎有些笨拙,但这是我能够在没有直接处理View的触摸事件(这可能是正确的方法)的情况下完成这项工作的唯一方法。

如果上下文菜单打开,我们基本上会更改TextView的LinkMovementMethod,因此 up 操作不会触发链接。当上下文菜单关闭时,我们会恢复LinkMovementMethod,以便正常点击链接按预期工作。

按如下方式调整onCreateContextMenu()方法:

textView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
        @Override
        public void onCreateContextMenu(ContextMenu menu,
                                        View view,
                                        ContextMenu.ContextMenuInfo info) {
            textView.setMovementMethod(ArrowKeyMovementMethod.getInstance());
            // Do stuff
        }
    });

然后像这样覆盖活动的onContextMenuClosed()

@Override
public void onContextMenuClosed(Menu menu)
{
    textView.setMovementMethod(LinkMovementMethod.getInstance());
}

当然,这假定textView是您的活动的类成员。

答案 1 :(得分:0)

就像迈克先生说的那样。

您可以改用setOnCreateContextMenuListener。并在此方法中执行单击父视图

示例:

这是视图组内的文本视图;

textview.setOnCreateContextMenuListener(
(menu, v, menuInfo) -> viewgroup.performLongClick());

答案 2 :(得分:0)

此解决方案似乎没有任何缺点:

<amp-analytics type="gtag" data-credentials="include">
  <script type="application/json">
    {
      "vars": {
        "gtag_id": "UA-48872168-2",
        "config": {
         "UA-48872168-2": { "groups": "default" }
        }
      },
      "triggers": {
        "form": {
          "selector": "#contact-form",
          "on": "submit-sucess",
          "vars": {
            "event_name": "CATEGORIA",
            "method": "AZIONE"
          }
        }
      }
    }
  </script>
</amp-analytics>

长按将显示预期的上下文菜单,但是抬起手指不会发生任何事情(因为点击已被取消)。不会在上下文菜单中产生 not 的快捷键将照常处理。