关于Android Focus的总结

最近带个项目,遇到很多焦点问题,很多人都无从下手,这里做个简单总结

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);

猜你喜欢

转载自blog.csdn.net/Ghost_tal/article/details/81025253