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时优先让里面的子视图成为焦点,只有子视图无法成为焦点时才让自己成为焦点视图。这个特性也是默认特性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值