最近遇到一个需求,就是需要把listview的item的点击事件传递给里面的ImageView,本来打算是重写onInterceptTouchEvent方法,使其返回false,让imageview可以传递事件的,但是感觉挺麻烦的,经大牛指导,原来普通的view有一个duplicateParentState属性,可以设置从父容器获取绘图状态,如:
<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:duplicateParentState="true" android:backgroud:"@drawable/selector" />
对于android:duplicateParentState,网上搜了一下,下面做个总结:
这个属性设置为true,表示此控件将从父容器中获取绘图状态(比如光标,按下等),而没有获取事件,也就是点一下父容器,imageview会有点击的效果,这样就可以自定义点击选中和未选中的背景了。
既然要总结一下,就加深一点,android:addStatesFromChildren这个属性刚好相反,让父元素的highlight状态与子元素的highlight状态保持一致:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res/com.alibaba.android.babylon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/bg" android:addStatesFromChildren="true"/>
注意事项:
android:duplicateParentState="true" 与android:addStatesFromChildren="true"在同一个layout文件中事项时,如果View1元素中已经定义了android:addStatesFromChildren="true",则View1中嵌套的子元素则不应该在定义android:duplicateParentState="true" ,否则会在渲染的时候crash。
这个还比较好理解:android:addStatesFromChildren只的是状态与子元素状态一致,如果对应的子元素状态还定义依赖父元素的状态的属性android:duplicateParentState,则会出现依赖上的死循环。
查了一下,还有一个android:descendantFocusability属性:
该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系。
属性的值有三种:
- beforeDescendants:viewgroup会优先其子类控件而获取到焦点
- afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
- blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
-
通常我们用到的是第三种,即在Item布局的根布局加上android:descendantFocusability=”blocksDescendants”的属性就好,自己控制子类的焦点事件。