gpt4 book ai didi

java - clearFocus() 和 focusableInTouchMode ="true"如何协同工作?

转载 作者:太空宇宙 更新时间:2023-11-04 13:29:37 24 4
gpt4 key购买 nike

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

我从这个屏幕开始:

enter image description here

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

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

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

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

enter image description here

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

如果我不设置 android:focusableInTouchMode="true",那么在屏幕 1 中单击“当前城市”也会导致屏幕 3。换句话说,它仍然停留在“当前城市”并且不会失去焦点。

问题有人可以解释一下发生了什么事吗?为什么省略 android:focusableInTouchMode="true" 会导致如此奇怪的行为?

最佳答案

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

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

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

关于java - clearFocus() 和 focusableInTouchMode ="true"如何协同工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32320371/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com