Young87

当前位置:首页 >个人收藏

Android焦点

ViewGroup中有一个mFocued成员来保存子视图中哪个子视图是具有焦点的视图,并且这样一直会递归下去。比如某个视图层次下的根视图ROOT下有A,B,C三个子视图,而B下面又有B1,B2,B3三个子视图,而这时候B3是具有焦点的子视图,那么在B中的mFocued保存的是B3,而ROOT下的mFocued保存的是B。
ViewGroup没有焦点并不代表其子视图也没有焦点,这里没有父子制约关系。
任何时候一个窗口内都只有一个视图具有焦点,或者所有视图都无焦点。
并不是所有视图都可以获取焦点。
/设置视图是否可以获得焦点
public void setFocusable(boolean focusable)
//获取视图是否可以获取焦点
public final boolean isFocusable()
//设置视图是否在触摸模式下可以获得焦点
public void setFocusableInTouchMode(boolean focusableInTouchMode)
//获取视图是否在触摸模式下获得焦点
public final boolean isFocusableInTouchMode()
/是否当前视图就是焦点视图
public boolean isFocused()
//当前视图是否是焦点视图,或者子视图里面有焦点视图。
public boolean hasFocus()
public boolean isFocusable(); //只判断自身
public boolean hasFocusable(); //除了判断自身外还判断子视图
public final boolean requestFocus() ;//这个方法是视图获得焦点的关键:
如果调用者是View且自己不可见(invisible or gone)或者不可获得焦点(isFocusable为false)或者父视图不允许自己获取焦点就会返回false表示成为焦点视图失败。如果能够成为焦点视图,那么就会调用onFocusChanged方法清除其他焦点视图。
如果是ViewGroup则根据setDescendantFocusability中的规则进行:如果是阻止子视图则自己进行焦点的获取,否则就按规则先子节点或者后子节点。
focusability可设置的值如下:

FOCUS_BLOCK_DESCENDANTS: 阻止子视图成为焦点视图,这样即使子视图调用了requestFocus也不能成为焦点视图。

FOCUS_BEFORE_DESCENDANTS: 当ViewGroup调用requestFocus时总是优先让自己成为焦点视图。

FOCUS_AFTER_DESCENDANTS: 当ViewGroup调用requestFocus时优先让里面的子视图成为焦点,只有子视图无法成为焦点时才让自己成为焦点视图。这个特性也是默认特性

除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇: Linux下的回收站trash

下一篇: jvm垃圾回收机制

精华推荐