背景:最近在做一个类似于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");
}
});
最后的结果是:
- Toast只输出“child_sec”
- Log:
由此可见:
- 在ViewGrop与子View之间,会只响应子View。
- 如果两个子View重合,会只响应最前面那个,然后响应事件就会被截断了。
我觉得应该是事件分发机制有关,但是书籍里面只是说了onTouch和dispatchTouchEvent没有将listener是怎样的,以后有机会再看看listener跟事件的分发机制有什么关系,应该是监听了ACTION_DOWN这个事件。
好像这篇文章讲得挺全了,还比较了一下clicklistener和touchlistener,mark一下回去看:
http://blog.csdn.net/carson_ho/article/details/54136311