作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个线性布局,上面有一个按钮和一个 TextView。我为 Activity 编写了一个 OnTouchEvent。如果我触摸屏幕,代码工作正常,但如果我触摸按钮,代码不起作用。对此有什么可能的解决方案?
public boolean onTouchEvent(MotionEvent event) {
int eventaction=event.getAction();
switch(eventaction)
{
case MotionEvent.ACTION_MOVE:
reg.setText("hey");
break;
}
return true;
}
最佳答案
问题在于 Android 如何处理触摸事件的操作顺序。每个触摸事件都遵循以下模式(简化示例):
但事件只会跟随链直到它们被消耗(意味着有人从 onTouchEvent()
或监听器返回 true)。如果您只是触摸屏幕上的某个位置,则没有人对该事件感兴趣,因此它会一直流向您的代码。但是,对于按钮(或其他可点击的 View
),它会消耗触摸事件,因为它对它感兴趣,因此流程在第 4 行停止。
如果你想监控进入你的 Activity 的所有触摸,你需要重写 dispatchTouchEvent()
因为总是首先调用 onTouchEvent()
Activity 最后被调用,并且只有在没有其他人捕获事件的情况下。但请注意不要在此处使用事件,否则 subview 将永远无法获取它们,并且您的按钮将无法点击。
public boolean dispatchTouchEvent(MotionEvent event) {
int eventaction=event.getAction();
switch(eventaction) {
case MotionEvent.ACTION_MOVE:
reg.setText("hey");
break;
default:
break;
}
return super.dispatchTouchEvent(event);
}
另一种选择是将您的触摸处理代码放入自定义 ViewGroup
(如 LinearLayout
)并使用其 onInterceptTouchEvent()
方法允许父 View 在必要时偷走并处理触摸事件。不过要小心,因为这种交互在新的触摸事件开始之前无法撤消(一旦你窃取了一个事件,你就窃取了所有事件)。
HTH
关于android - OnTouchEvent 不适用于 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11001282/
我是一名优秀的程序员,十分优秀!