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

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

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


    

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

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会响应哪一个?)