bug 重现:通过 mListView.setOnItemClickListener 设置 item 点击事件,正常情况下没有问题,但当 item 里面嵌套了抢焦点的控件(比如 Button ,CheckBox 等),那么点击 item 的时候,Button 等抢焦点的控件会抢先反应,就会导致点击 item 时没有反应。
解决办法:想要 item 有自己的焦点,Button 等控件有自己的焦点的话,需要在 item 的根控件里面设置 android:descendantFocusability="blocksDescendants"
,这个属性值表示子有子的焦点,父有父的焦点。
java 代码
1 2 3 4 5 6
| mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Log.i(TAG, "onItemClick: ------"); } });
|
item 布局文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:descendantFocusability="blocksDescendants" android:orientation="horizontal">
<!--标题--> <TextView android:id="@+id/tv_title" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:singleLine="true" android:text="标题" />
<!--删除按钮--> <Button android:id="@+id/bt_cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="删除"/>
</LinearLayout>
|
属性 android:descendantFocusability 的值有三种:
1 2 3
| beforeDescendants:viewgroup会优先其子类控件而获取到焦点 afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点 blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点,也就是各有各的焦点
|