最近带个项目,遇到很多焦点问题,很多人都无从下手,这里做个简单总结
1.焦点的种类
之前一直以为焦点都是一样,后来发现,焦点分为两种
-
硬键盘焦点focusable
通过硬键盘(或物理键盘:蓝牙键盘等)上下左右操作焦点,点击,输入 -
触摸焦点focusableInTouchMode
针对触屏情况下,点击屏幕的控件,先触发 OnFocusChangeListener,获取控件焦点,然后执行点击事件。EditText是默认有触摸获取焦点功能的,并将第一抢先获取焦点,因此页面有EditText的时默认有光标,键盘弹出。
2.如何设置焦点
-
硬键盘焦点
在XML文件中设置android:focusable=”true” -
触摸焦点
android:focusableInTouchMode=”true”
3.焦点的判断
- 当前视图是否是焦点视图–View.isFocused()
- 当前视图或者其子视图是否含有焦点–View.hasFocus()
- 另外空间默认触摸焦点和硬键盘焦点的判断
4.ViewGroup中的焦点
view.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS)
FOCUS_BLOCK_DESCENDANTS:阻止子视图成为焦点视图,即使子视图调用requestFocus()也不能成为焦点视图。
FOCUS_BEFORE_DESCENDANTS:当ViewGroup调用requestFocus时总是优先让自己成为焦点视图。
FOCUS_AFTER_DESCENDANTS:当ViewGroup调用requestFocus时优先让里面的子视图成为焦点,只有子视图无法成为焦点时才让自己成为焦点视图,这个特性也是
默认特性
。
5.常见焦点问题
- LiveView的中item 无法获取焦点
解决方法 :
mListView.setItemsCanFocus(true);
mListView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
- ScrollView默认抢占硬键盘焦点
- ScrollView中的子控件含有焦点,会自动显示有焦点的控件
解决方法:
在获取焦点的控件,
设置XML android:descendantFocusability=”blocksDescendants”
或 子控setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);