我有一个启动上下文菜单的 TextView:
textView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
@Override
public void onCreateContextMenu(ContextMenu contextMenu,
View view,
ContextMenu.ContextMenuInfo contextMenuInfo) {
// Do stuff...
}
});
此文本视图还在其 XML 中设置了android:autoLink="all"
属性。
现在,如果我将 TextView 的内容设置为 URL 并长按 URL,则首先出现上下文菜单,但是当我抬起手指时,链接被按下并打开浏览器。
有没有办法让上下文菜单或长按消耗触摸事件,以便不单击链接?我考虑过覆盖 TextView onTouch()
来处理ACTION_UP事件,但我无法可靠地跟踪上下文菜单何时可见以阻止触摸事件。
这对我来说似乎有些笨拙,但这是我能够在不直接处理视图的触摸事件的情况下完成这项工作的唯一方法(这很可能是正确的方法)。
如果上下文菜单打开,我们实际上是在更改 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
是活动的类成员。
就像Mike M.说的那样。
你可以改用setOnCreateContextMenuListener。 并在此方法中执行单击父视图
例:
下面是视图组内的文本视图;
textview.setOnCreateContextMenuListener(
(menu, v, menuInfo) -> viewgroup.performLongClick());
这个解决方案似乎没有任何缺点:
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))
}
长按将按预期显示上下文菜单,但抬起手指时不会发生任何反应(因为点击已被取消)。不会导致上下文菜单的短点击将照常处理。