您的位置:首页 > 移动开发 > Android开发

android中的ListView中的item获取焦点事件或者绘制状态

2015-04-24 16:17 399 查看
最近遇到一个需求,就是需要把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”的属性就好,自己控制子类的焦点事件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐