1

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

我从这个屏幕开始:

在此处输入图像描述

当我触摸“您来自的城市”中的文本区域时,我会看到以下屏幕: 在此处输入图像描述

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

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

否则,我会得到以下屏幕:

在此处输入图像描述

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

如果我没有设置,单击屏幕 1 中的“当前城市”也会导致屏幕 3 android:focusableInTouchMode="true"。换句话说,它保持在“当前城市”并且不会失去焦点。

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

4

1 回答 1

0

我在clearFocus()源代码上方的评论中找到了答案:

“当这个视图想要放弃焦点时调用。如果焦点被清除 onFocusChanged(boolean,int,android.graphics.Rect) 被调用。注意:当视图清除焦点时,框架试图将焦点赋予第一个焦点视图顶部。因此,如果此视图是顶部中第一个可以获取焦点的视图,则将调用与清除焦点相关的所有回调,然后框架将焦点放在此视图上。

换句话说,当一个视图放弃焦点时,框架从根开始遍历层次结构,寻找它可以给予焦点的第一个视图。当我省略时android:focusableInTouchMode="true",框架将焦点放在“当前城市”,因为这是它发现的第一个可聚焦的视图。当多个事物都集中在同一层次结构上时,框架从最接近实际 xml 代码底部的视图开始。这样做的原因是,如果 2 个视图在层次结构中的同一级别,并且您要将视图放置在屏幕上的同一位置,则最接近代码底部的视图将出现在屏幕顶部。

于 2015-08-31T23:15:28.343 回答