美文网首页
在一个位置有两个不同的OnClickListener会响应哪一个

在一个位置有两个不同的OnClickListener会响应哪一个

作者: 与猎犬赛跑的野兔 | 来源:发表于2017-09-15 17:44 被阅读0次

背景:最近在做一个类似于listview表头悬挂并且把上面的view给“顶上去”的功能,主要解决思想是将listview写在一个FrameLayout里面,然后在用一个一模一样的表头放在listview的前面,设置滚动监听器当滚上去时,把假的表头设置为可见,即可模拟IOS的表头悬挂并有一个上顶的效果,但是这里面有一个问题。问题在于我在adapter里面给表头加了一个OnClickListener,外面又给假的表头设置了OnClickListener,那么当两者重合在一起的时候,会响应哪一个呢?

带着疑问,我写了一个demo,主要是在FrameLayout里面写两个button,这两个button长度大小一致,并且FrameLayout也是height = width = wrap_content

<FrameLayout
      android:id="@+id/btn_parent"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      >
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click"
        android:id="@+id/btn_child"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click"
        android:id="@+id/btn_child_sec"
        />
  </FrameLayout>

然后在外面给这三个都加上监听器,看那个响应:

findViewById(R.id.btn_parent).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Toast.makeText(SoundTest.this,"parent",Toast.LENGTH_SHORT).show();
        Log.i("steve","parent");
      }
    });

    findViewById(R.id.btn_child).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Toast.makeText(SoundTest.this,"child",Toast.LENGTH_SHORT).show();
        Log.i("steve","child");
      }
    });
    findViewById(R.id.btn_child_sec).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Toast.makeText(SoundTest.this,"child_sec",Toast.LENGTH_SHORT).show();
        Log.i("steve","child_sec");
      }
    });

最后的结果是:

  1. Toast只输出“child_sec”
  2. Log:
image.png

由此可见:

  1. 在ViewGrop与子View之间,会只响应子View。
  2. 如果两个子View重合,会只响应最前面那个,然后响应事件就会被截断了。

我觉得应该是事件分发机制有关,但是书籍里面只是说了onTouch和dispatchTouchEvent没有将listener是怎样的,以后有机会再看看listener跟事件的分发机制有什么关系,应该是监听了ACTION_DOWN这个事件。

好像这篇文章讲得挺全了,还比较了一下clicklistener和touchlistener,mark一下回去看:
http://blog.csdn.net/carson_ho/article/details/54136311

相关文章

网友评论

      本文标题:在一个位置有两个不同的OnClickListener会响应哪一个

      本文链接:https://www.haomeiwen.com/subject/ddcesxtx.html