如何解决如何使onTouchEvent,长按和上下文菜单协同工作?
| 在我们的应用程序中,我们有一个自定义视图(扩展了ImageView
),并在其中处理触摸事件以记录数据。我想向此视图添加上下文菜单功能,并遵循官方Android文档中的准则。
onTouchEvent
代码本身可以正常工作。上下文菜单代码也可以正常工作。但是,如果我同时添加它们,上下文菜单代码将停止工作。我发现添加了这两个代码后,将永远不会调用onCreateContextMenu
,因此就不会显示上下文菜单。
根据我对Android文档的解释,从onTouchEvent
返回false
表示未使用该事件,因此应将其用于进一步处理。由于某种原因,这里没有发生。如果有人能告诉我我所缺少的,我将不胜感激。顺便说一句,目标是运行2.3.4 ROM的Nexus One。
这是自定义视图中ѭ1的代码:
public boolean onTouchEvent(MotionEvent event)
{
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
// Add event coordinates to an arraylist
break;
}
return false;
}
预先感谢您的任何帮助。
解决方法
详细说明hackbod的答案,您可能应该将最后一个方法声明为
return super.onTouchEvent(event);
。
我猜想,如果您不处理事件,并且不调用默认的View行为,那么没人会做任何事情,并且什么也不会发生。
返回值的点可能是例如调用某些祖先的默认行为,并让派生类知道祖先是否处理了该事件。
在Android Developers上进行了一些搜索之后,引用该主题会在此处覆盖该View的现有回调方法:
这使您可以为自定义视图中的每个事件定义默认行为,并确定是否应将事件传递给其他子视图。
因此,返回值背后的主要思想是让Android知道是否应将事件传递给子级View。
高温超导
编辑:
关于您在评论中提到的“方向”,通常来说(即,不仅在Android上)UI事件处理过程如下所示:
在某个时候,派生的自定义控件会接收到该事件。在事件挂钩实现中,是否参与祖先的行为取决于您。这就是关于类继承方向的全部内容。
然后,还有另一个方向,一个与UI控件层次结构相关的方向。您的自定义控件可能包含在一个较大的控件容器中,并且您的控件也可能包含其他内部控件(文本框,按钮等)。关于此方向,如果您声明不处理事件(返回false),则UI事件处理机制会将存储桶传递给包含(?)控件(请以您的背景为准)。
, 您可以从长按监听器中拨打电话,
openContextMenu(View view)
http://developer.android.com/reference/android/app/Activity.html#openContextMenu(android.view.View)
, 不要在OnCreate()
中注册上下文菜单,请在onTouch()
中进行注册
返回true;
registerForContextMenu(View v);
openContextMenu(View v);
return true;
, 返回false告诉父母您没有使用该事件。 View的默认实现为该视图实现触摸处理。如果要执行,则必须调用super.onTouchEvent(event);。
, 我最近遇到类似的问题。当我在RecyeclerView
的孩子中启用长期可点击时,在RecyclerView
的onTouchEvent
中不会收到ACTION_DOWN
事件。
如果我改成RecyclerView
的ѭ17I,我会工作。可以接收“ 13”事件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。