clearFocus()和focusableInTouchMode =“true”如何协同工作?

时间:2015-08-31 21:38:14

标签: java android focusable

我希望有人解释以下两种行为。

我从这个屏幕开始:

enter image description here

当我触摸“你来自城市”内的文字区域时,我会看到以下屏幕: enter image description here

当我按下键盘的“完成”按钮时,我会按预期返回原始状态。换句话说,隐藏的框再次可见,光标消失(EditText不再具有焦点)。这是怎么回事我只是有一个监听器等待按下“完成”按钮。发生这种情况时,我会在clearFocus()视图上致电EditText。然后我有一个OnFocusChangeListener,根据EditText是否具有焦点,使所有框不可见/可见。

但是,当我使用以下属性设置祖先布局(即父级或祖父级的RelativeLayout)时,我才会得到这种预期的行为:android:focusableInTouchMode="true"

另外,我得到以下屏幕:

enter image description here

当调用clearFocus()时,它会跳转到hieararchy中的下一个孩子,即“当前城市”并给出EditText焦点(隐藏键盘,但这是预期行为的一部分) 。

如果我没有设置android:focusableInTouchMode="true",则点击屏幕1中的“当前城市”会产生屏幕3。换句话说,它仍然处于“当前城市”并且不会失去焦点。

问题 有人可以解释一下发生了什么吗?为什么遗漏android:focusableInTouchMode="true"导致这种奇怪的行为?

1 个答案:

答案 0 :(得分:0)

我在clearFocus()的source code上方的评论中找到了答案:

“当此视图想要放弃焦点时调用。如果焦点被清除,则调用onFocusChanged(boolean,int,android.graphics.Rect)。 注意:当View清除焦点时,框架会尝试从顶部开始关注第一个可聚焦视图。因此,如果此视图是从顶部开始可以获得焦点的第一个视图,则在框架将焦点放在此视图之后,将调用与清除焦点相关的所有回调。“

换句话说,当一个视图放弃焦点时,框架会从根开始遍历hiearachy,寻找它可以关注的第一个视图。当我遗漏android:focusableInTouchMode="true"时,框架将焦点放在“当前城市”上,因为这是它发现的第一个可以集中注意的视图。当多个事物可以在同一级别的层次结构上聚焦时,框架从最接近实际xml代码底部的视图开始。原因是因为如果两个视图位于层次结构中的同一级别上,并且您将视图放置在屏幕上的相同位置,则最接近代码底部的视图将显示在屏幕的顶部。