1.android事件分发简述
安卓应用的界面就是一层一层的view嵌套排列组合而成,对于某些终端view(里边不能再有view),比如Textview,用户触摸到这个控件,就是它孤身一人,所有事件都交给这个终端view处理了
Android的UI界面都是由View和ViewGroup及其派生类组合而成的。其中,View是所有UI组件的基类,而ViewGroup是容纳这些组件的容器,其本身也是从View派生出来的.
LinearLayout就是viewGroup的一种,LinearLayout里边可以放各种控件
LinearLayout的背景
事件分发说的就是 在viewGroup嵌套viewGroup的时候,我们点击了这个控件,谁来处理这个事件呢?通常先是最外层的控件来处理(即通常所说的消费, consumed),最外层不处理,交给里边的控件,一层一层,由外而内.如果我们想让谁来consume这个点击事件,就要根据情况来处理逻辑了.
如果自定义控件涉及到事件处理,一般都会重写onInterceptTouchEvent()和onTouchEvent()这两个方法,所以大家最关心的也是这两个方法,但其实dispatchTouchEvent()这个方法才是整个事件处理中最为重要的方法,特别是ViewGroup中的dispatchTouchEvent()方法。
那么讲了这么多铺垫,说下今天要说的问题,如果scrollview中嵌套listview,两者都可以滑动,如果不做处理,点击事件(称触摸事件更形象准确)就由最外层的scrollview来consume了,listview就不会滑动了.
2.简单处理方法
那么怎么办呢?
那就在activity中重写dispatchTouchEvent()方法
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_MOVE) {
listView.dispatchTouchEvent(ev);
}
return super.dispatchTouchEvent(ev);
}
这样,达到的效果就是,在listview的控制区域有触摸事件,就由listview来处理了.
怎么样,是不是很简单?
推荐几篇相关文章:
Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
Andriod 从源码的角度详解View,ViewGroup的Touch事件的分发机制