4

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

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

此文本视图还在android:autoLink="all"其 XML 中设置了属性。

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

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

4

3 回答 3

2

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

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

调整您的onCreateContextMenu()方法如下:

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

然后像这样覆盖Activity onContextMenuClosed()

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

当然,这假设它textView是您的 Activity 的类成员。

于 2014-12-10T04:19:48.550 回答
0

就像 Mike M. 所说的那样。

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

例子:

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

textview.setOnCreateContextMenuListener(
(menu, v, menuInfo) -> viewgroup.performLongClick());
于 2017-08-17T10:35:36.013 回答
-1

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

override fun onCreateContextMenu(menu: ContextMenu, view: View, menuInfo: ContextMenuInfo) {
    // Inflate your menu, etc

    // ...

    // Cancel any tap in progress
    view.dispatchTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_CANCEL, 0f, 0f, 0))
}

长按将按预期显示上下文菜单,但当您抬起手指时不会发生任何事情(因为点击已被取消)。不会导致上下文菜单的短按将照常处理。

于 2018-12-14T13:42:27.593 回答