ListView Item 与子控件焦点问题

[TOC]

表现

item中有3个控件,其中有2个控件是可以正常获取到焦点,但是第三个点击的时候,却出发了Item的点击事件。

原因

ListView默认情况时

  • 当item有焦点时,item上的button等子控件获取不到焦点;
  • 当子控件有焦点时,item无焦点无法响应onItemClick事件;

解决策略

ListView XML 属性

放在listview中的item的顶级布局上

android:descendantFocusability
Constant Value Description
beforeDescendants 0 The ViewGroup will get focus before any of its descendants. Item 先获取到焦点
afterDescendants 1 The ViewGroup will get focus only if none of its descendants want it. 子控件获取到焦点--- 也就是item无法获取到焦点
blocksDescendants 2 The ViewGroup will block its descendants from receiving focus. 让子控件无法获取焦点 --事实证明子控件是可以获取到焦点的

ViewGroup 关于焦点的策略参数

  • ViewGroup.FOCUS_AFTER_DESCENDANTS:表示item的子控件优先于item获得焦点;
  • ViewGroup.FOCUS_BEFORE_DESCENDANTS:表示item优先于其子控件获得焦点。
listView.setOnItemSelectedListener(onItemSelectedListener);
private AdapterView.OnItemSelectedListener  onItemSelectedListener =
    new AdapterView.OnItemSelectedListener(){
    @Override
    public void onItemSelected(AdapterView<?> parent, View view,
            int position, long id) {
        //当此选中的item的子控件需要获得焦点时
        parent.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
        //else parent.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        parent.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容