Android 焦点小结

来源:互联网 发布:nginx 访问根目录 编辑:程序博客网 时间:2024/05/29 17:41

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的方法

@overrideprotected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {    return 0;}
0 0
原创粉丝点击