Android 焦点小结

1.Focusable 和 FocusableInTouchMode
FocusableInTouchMode
推荐《Android touch mode和focusableInTouchMode分析》,这篇讲的很好,感谢大神!
需要注意的是FocusableInTouchMode的使用,例如一个简单的页面三个按钮,前两个设置FocusableInTouchMode=true,最后一个什么都不设置(FocusableInTouchMode默认为false),这时候监听它们各自的onTouch事件和onClick事件。
程序启动后会发现第一个按钮高亮了,点击第一个按钮发现响应了down,up,click;这时候点击第二个会发现只是响应了down和up,并没有相应click,不过第二个按钮高亮了。然后再次点击第二个按钮才会响应down,up,click。最后点击第三个按钮发现响应了down,up,click,但是没有高亮。
原因是当一个View设置了FocusableInTouchMode=true时,第一次点击它,它会尝试获取焦点,如果获取成功就会高亮显示但不会触发onClick事件,只有在第二次点击时才会触发onClick事件。

Focusable设置是否可以获取焦点,一个比较经典的就是ListView中有一个Button,如果没有设置Button的Focusable的话,按钮点击事件能够响应,但是ListView的ItemClick无法响应,这时候将Button的Focusable设为false,ItemClick就能够响应了。

2.ListView无法响应点击事件
一个页面比较复杂,ScrollView嵌套各种ViewGroup,并且还有ListView等,有的时候ListView的ItemClick事件无法响应,监听ListView的onTouch事件了发现每个Item都响应了down和up,并且Item中的都设置了Focusable=false。
这时候可能是ListView的焦点丢失了,在ListView的onTouch的down事件中手动获取焦点即可。

3.在ScrollView中,当某一个View获取了焦点(一般是焦点改变),ScrollView会自动滚动到该View置顶的位置,一种解决方法是重写ScrollView的方法

@override
protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值