OnTouchEvent不能处理子视图

use*_*128 27 android ontouchlistener

我有一个线性布局,上面有一个Button和一个TextView.我为活动写了一个OnTouchEvent.如果我触摸屏幕,代码工作正常,但如果我触摸按钮代码不起作用.这有什么可能的解决方案?

public boolean onTouchEvent(MotionEvent event) {
   int eventaction=event.getAction();


   switch(eventaction)
   {
   case MotionEvent.ACTION_MOVE:
      reg.setText("hey");


   break;
   }
   return true;

  }
Run Code Online (Sandbox Code Playgroud)

Dev*_*red 95

问题是Android如何处理触摸事件的操作顺序.每个触摸事件都遵循(简化示例)的模式:

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

但是事件只会在消费之前跟随链(意味着有人从onTouchEvent()听众那里得到回报).如果你只是触摸屏幕上的某个地方,没有人对这个事件感兴趣,所以它一直流到你的代码.但是,在按钮(或其他可点击的View)的情况下,它会消耗触摸事件,因为它对它感兴趣,因此流程在第4行停止.

如果要监视进入Activity的所有触摸,则需要覆盖,dispatchTouchEvent()因为始终首先onTouchEvent()调用的是,最后调用Activity,并且只有在没有其他人捕获事件的情况下.但是,请注意不要在此处使用事件,否则子视图将永远不会获取它们,并且您的按钮将无法点击.

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);
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是将您的触摸处理代码放入自定义ViewGroup(例如LinearLayout)中,并使用其onInterceptTouchEvent()方法允许父视图在必要时偷走并处理触摸事件.但要小心,因为这种互动是一个在新的触摸事件开始之前无法撤消的互动(一旦你偷了一个事件,你就会把它们全部偷走).

HTH