gpt4 book ai didi

android - OnTouchEvent 不适用于 subview

转载 作者:IT老高 更新时间:2023-10-28 22:10:49 24 4
gpt4 key购买 nike

我有一个线性布局,上面有一个按钮和一个 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 如何处理触摸事件的操作顺序。每个触摸事件都遵循以下模式(简化示例):

  1. Activity.dispatchTouchEvent()
  2. ViewGroup.dispatchTouchEvent()
  3. View.dispatchTouchEvent()
  4. View.onTouchEvent()
  5. ViewGroup.onTouchEvent()
  6. Activity.onTouchEvent()

但事件只会跟随链直到它们被消耗(意味着有人从 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com