android - 如何在 ViewGroup 级别处理所有 TouchEvent(即冒泡所有事件直至包含 View 组)

标签 android android-layout

我想在容器级别处理所有触摸事件。换句话说,我希望所有触摸事件都到达容器级别。现在我发现如果触摸的位置没有落在 View 组包含的 UI 组件上,TouchEvents 只会到达包含的 ViewGroup。包含的 UI 元素处理 TouchEvent,它不会冒泡到容器。有谁知道如何保证所有触摸事件都到达顶级容器?

为了清楚起见,想象一个具有多个按钮、多个编辑文本和多个复选框的 Activity 。一个典型的形式。通常我看到每个 UI 组件都会捕获落在它上面的 TouchEvent,而容器却一点也不聪明。所以我想知道容器/ View 组如何获知所有落在其区域内任何地方的触摸,无论该区域是否被按钮、空白区域或编辑文本占用。

最佳答案

我是这样解释你的问题的:

你有这样的 View 树

  • 查看 G 组
    • View A
    • 观点B
    • ...

并且您希望 G 处理触摸时创建的 MotionEvent,即使它被 A、B、...中的任何一个消费了也是如此


如何:

我会给你两个选择。取决于你是否想忽略

的消费
  1. 每个 child
  2. 仅选定的 child

使用以下模板之一:

  1. 重写 G 中的 dispatchTouchEvent()

    // In G
    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
         super.dispatchTouchEvent(event);
    
         // Handle event here instead of using an OnTouchListener
    
         return true;
     }
    
  2. 在每个应该忽略消费的 child 中覆盖 dispatchTouchEvent()

    • 忽略部分 child

      // In every child whose consumption should be ignored
      @Override
      public boolean dispatchTouchEvent(MotionEvent event) {
           super.dispatchTouchEvent(ev);
      
           return false; // false means "I did not consume the event"
       }
      
    • 不要忘记设置监听器

      // In G, before touch should be recognized
      setOnTouchListener(new OnTouchListener() {
          @Override
          public boolean onTouch(View v, MotionEvent event) {
              // Handle event here
      
              return true; // true means "I did consume the event"
          }
      });
      

以代码行数衡量,选项 1 简单得多。选项 2 是为了以防万一您需要对 A、B 中的某些内容进行特殊处理...

关于android - 如何在 ViewGroup 级别处理所有 TouchEvent(即冒泡所有事件直至包含 View 组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11460789/

相关文章:

android - 在 Recyclerview 中点击一个项目会影响每七个项目吗?

android - 在android中显示二维按钮数组

Galaxy Tab 10.1 上的 Android ADK 错误

android - 720x1280 设备的布局文件夹名称,如三星 Galaxy S3

android - AdMob 和不同屏幕分辨率/DPI/比率

android - 获取删除了 base.apk 的第 3 方应用程序的 list 文件

Android 布局大小和调整大小

android - android中findViewById的交替和快速替换

android - 在父 ConstraintLayout 中水平居中固定大小的 ImageView

安卓应用程序列表