2

在我们的应用程序中,我们有一个自定义视图(扩展ImageView),我们在其中处理触摸事件以记录数据。我想在这个视图中添加上下文菜单功能,并遵循官方 Android 文档中的指南。

onTouchEvent代码本身可以正常工作。上下文菜单代码也可以正常工作。但是,如果我同时添加它们,上下文菜单代码将停止工作。我发现添加了两段代码后,onCreateContextMenu永远不会调用,因此永远不会显示上下文菜单。

根据我对Android文档的解释,falseonTouchEvent表示该事件没有被消费,因此应该用于进一步处理。出于某种原因,这里没有发生。如果有人能告诉我我错过了什么,我将不胜感激。顺便说一句,目标是运行 2.3.4 ROM 的 Nexus One。

这是onTouchEvent自定义视图中的代码:

public boolean onTouchEvent(MotionEvent event) 
{
    switch (event.getAction())
    {
        case  MotionEvent.ACTION_DOWN:
            // Add event coordinates to an arraylist
            break;
    }

    return false;
}

预先感谢您的任何帮助。

4

5 回答 5

2

详细说明 hackbod 答案,您可能应该拥有最后一个方法声明return super.onTouchEvent(event);

我想如果你不处理这个事件,并且如果你不调用默认的 View 行为,那么没有人会做任何事情,也不会发生任何事情。

例如,返回值的点可能是调用某些祖先的默认行为,并让派生类知道祖先是否处理了事件。

在对 Android Developers 进行了一些搜索之后,参考主题覆盖 View here的现有回调方法, 它说:

这允许您为自定义视图中的每个事件定义默认行为,并确定是否应将事件传递给其他子视图。

因此,返回值背后的主要思想是让 Android 知道是否应该将事件传递给子视图。

高温高压

编辑:

关于您在评论中提到的“方向”,一般来说(即不仅在 Android 上)UI 事件处理过程是这样的:

在某些时候,您的派生自定义控件会收到该事件。在您的事件挂钩实现中,是否涉及祖先的行为取决于您。这就是关于类继承方向的全部内容。

然后是另一个方向,与UI 控件层次结构相关的方向。您的自定义控件可能包含在一个更大的控件容器中,您的控件也可能包含其他内部控件(文本框、按钮等)。关于这个方向,如果您声明不处理事件(返回 false),那么 UI 事件处理机制会将存储桶传递给包含(?) 控件(想想您的背景中的那个)。

于 2011-05-30T19:35:41.073 回答
1

你可以从你的长按监听器中调用,

openContextMenu(View view)

http://developer.android.com/reference/android/app/Activity.html#openContextMenu(android.view.View )

于 2011-05-30T17:36:24.623 回答
1

不要在 中注册上下文菜单OnCreate()onTouch()在返回 true 之前注册;

registerForContextMenu(View v);
openContextMenu(View v);
return true;
于 2017-06-21T00:29:00.053 回答
0

返回 false 告诉父母您没有使用该事件。View 的默认实现为该视图实现触摸处理;如果你想让它执行,你必须调用 super.onTouchEvent(event);

于 2011-05-30T17:41:45.543 回答
0

我最近遇到了类似的问题。RecyeclerView当我在's 的孩子中启用长可点击时,在' sACTION_DOWN中无法接收到该事件。RecyclerViewonTouchEvent

如果我改为RecyclerView's dispatchTouchEvent,我会工作。ACTION_DOWN可以接收事件。

于 2016-02-24T03:41:44.803 回答