【问题标题】:Handling Intercept touch event without extending ViewGroup在不扩展 ViewGroup 的情况下处理拦截触摸事件
【发布时间】:2014-01-27 15:13:39
【问题描述】:

我有一个RelativeLayout,这个布局有近 10 个视图。

我已将OnTouchListener 设置为此布局并在其中做一些工作并返回true

当我触摸没有视图的布局时,这个监听器工作正常(意味着在空白区域)。如果我触摸此布局的子视图,则此侦听器不会触发...

从文档中,我了解到我们可以通过扩展 ViewGroup(所以这里是 RelativeLayout)覆盖 onInterceptTouchEvent() 并在子视图使用此事件之前处理触摸事件...

这会起到作用,但我需要修改许多需要此功能的 xml 文件,方法是用我的 CustomRelativeLayout 替换 RelativeLayout。

所以我的问题是:

RelativeLayout 中的子视图消耗事件之前,有什么方法可以处理RelativeLayout(当然是ViewGroup)的触摸事件?我不想扩展RelativeLayout...

【问题讨论】:

  • 没有这样的方法:你必须扩展RelativeLayout

标签: android touch-event ontouchlistener


【解决方案1】:

尝试将 onTouchListener 添加到 RelativeLayout

RelativeLayout rl = (RelativeLayout) findViewById( R.id.relativeLauout );
    rl.setOnTouchListener( new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // do something
            return false;
        }
    });

或者使用Activity中的onTouchEvent方法

@Override
public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
    return super.onTouchEvent(event);
}

【讨论】:

  • 感谢您的回答...在提问之前我已经尝试了您的两种方法...但它不起作用:-(
  • 可以尝试扩展 onTouchListener 并将它们设置为布局中的所有视图
【解决方案2】:

尝试覆盖

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    return super.dispatchTouchEvent(ev);
}

Activity。 该方法是第一个处理触摸事件的方法。 但在这种情况下,您需要使用视图的当前坐标

【讨论】:

    【解决方案3】:

    你可以简单地在你的xml中设置:

    android:clickable="true"
    

    【讨论】:

      【解决方案4】:

      在处理ACTION_DOWN事件时,尝试在子视图的onTouchEvent()方法中返回false。所以转发触摸事件不会被发送到子视图,也就是不消耗事件。

      【讨论】:

        【解决方案5】:

        虽然不一定是理想的,但这适用于没有动态内容的较小布局。

        在 xml 中,将 android:clickable="false" 设置为布局中 ViewGroup 的所有后代(包括嵌套的 ViewGroup 及其子项)。每个被点击的孩子都会将点击传播给它的父母,最终到达 ViewGroup 的默认触摸处理程序。确保设置根 ViewGroup,您希望在其中获取点击事件为 android:clickable="true"viewgroup.setClickable(true)

        如果您动态添加视图,请确保在将其添加到视图层次结构之前调用view.setClickable(false);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-07-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多