本节引言
如果你往ListView的Item中添加了Button,CheckBox,EditText等控件的话,你可能需要考虑 到一个问题:ListView的一个焦点问题!本节我们就来学习下解决这个问题的几个方法!
很多人都会碰到这种情况:写了一个简单的ListView,里面放了Button、CheckBox、EditText,结果一点击才发现,ListView的item根本点不动,onItemClick触发不了,onItemLongClick也一样没有反应。说白了,这其实就是ListView里很典型的焦点问题——焦点被其他子控件抢走了。那这个问题到底该怎么处理?下面就接着往下看。
方法1:为抢占了控件的组件设置:android:focusable="false"
这个问题其实不复杂,关键就在于:把抢占了 ListView Item 焦点的控件设为android:focusable="false",基本就能处理掉。
如果是通过代码来处理,那么拿到对应控件之后,直接调用:setFocusable(false) 也可以。
不过要特别说明一点,EditText 这里并不适用。因为一旦给它设置 android:focusable="false",虽然它看起来还能获取焦点,但很快又会把焦点丢掉,同时小键盘也不会弹出来。至于这个问题为什么会这样,目前还没有明确结论,外面也有人提到这可能是 ListView 的一个 bug。要是恰好有更稳妥的解决办法,那确实值得继续补上。
方法2:item根节点设置android:descendantFocusability="blocksDescendants"
如题,在Item布局的根节点添加上述属性,android:descendantFocusability="blocksDescendants" 即可,另外该属性有三个可供选择的值:
- beforeDescendants:viewgroup会优先其子类控件而获取到焦点
- afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
- blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
本节小结:
好的,以上就是解决ListView焦点问题的两个方法,非常简单,如果有关于EditText 焦点问题解决方案的欢迎提出,谢谢~
