美文网首页
在一个位置有两个不同的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