我希望有人解释以下两种行为。
我从这个屏幕开始:
当我按下键盘的“完成”按钮时,我会按预期返回原始状态。换句话说,隐藏的框再次可见,光标消失(EditText不再具有焦点)。这是怎么回事我只是有一个监听器等待按下“完成”按钮。发生这种情况时,我会在clearFocus()
视图上致电EditText
。然后我有一个OnFocusChangeListener
,根据EditText是否具有焦点,使所有框不可见/可见。
但是,当我使用以下属性设置祖先布局(即父级或祖父级的RelativeLayout)时,我才会得到这种预期的行为:android:focusableInTouchMode="true"
另外,我得到以下屏幕:
当调用clearFocus()
时,它会跳转到hieararchy中的下一个孩子,即“当前城市”并给出EditText
焦点(隐藏键盘,但这是预期行为的一部分) 。
如果我没有设置android:focusableInTouchMode="true"
,则点击屏幕1中的“当前城市”会产生屏幕3。换句话说,它仍然处于“当前城市”并且不会失去焦点。
问题
有人可以解释一下发生了什么吗?为什么遗漏android:focusableInTouchMode="true"
导致这种奇怪的行为?
答案 0 :(得分:0)
我在clearFocus()的source code上方的评论中找到了答案:
“当此视图想要放弃焦点时调用。如果焦点被清除,则调用onFocusChanged(boolean,int,android.graphics.Rect)。 注意:当View清除焦点时,框架会尝试从顶部开始关注第一个可聚焦视图。因此,如果此视图是从顶部开始可以获得焦点的第一个视图,则在框架将焦点放在此视图之后,将调用与清除焦点相关的所有回调。“
换句话说,当一个视图放弃焦点时,框架会从根开始遍历hiearachy,寻找它可以关注的第一个视图。当我遗漏android:focusableInTouchMode="true"
时,框架将焦点放在“当前城市”上,因为这是它发现的第一个可以集中注意的视图。当多个事物可以在同一级别的层次结构上聚焦时,框架从最接近实际xml代码底部的视图开始。原因是因为如果两个视图位于层次结构中的同一级别上,并且您将视图放置在屏幕上的相同位置,则最接近代码底部的视图将显示在屏幕的顶部。