我有一个包含5 EditTexts
的片段,前四个有actionNext
,最后一个有actionDone
。我有一个问题,当我在4-th
EditText并按下软键盘中的下一个时,它会从第4个EditText中移除焦点,而焦点无处可去,键盘仍然可见。当我按下键盘上的下一个按钮时,焦点转到5-th
EditText,而不是一切都按原样进行。
问题
当我在4-th
EditText时,我必须按下键盘上的actionNext 2 times
才能到达5-th
EditText。
环境
我正在使用AppCompatActivity,支持片段,EditText在android.support.design.widget.TextInputLayout中,我使用AndroidAnnotations。
答案 0 :(得分:2)
现在我找到了这个奇怪问题的解决方案,我发布它是为了帮助有同样问题的人或找到更好的建议:)
我的问题与片段有关。
我有一个带有2个片段的活动。加载活动时,它会打开第一个带有替换事务的片段
mTransaction.replace(R.id...
第一个片段有2个EditText。当用户单击第一个片段中的按钮时,活动将打开第二个片段,其中包含发生错误的5个EditTexts。这就是我进行第二次片段交易的方式:
mTransaction.add(R.id...
mTransaction.addToBackStack(null);
mTransaction.commit();
这就是问题,因为当第二个片段被提交时,我使用add
进行片段事务,这使得第一个片段留在容器中,因此这导致了我的bug。
在我看来,第一个片段的EditText在那里,它获得了焦点,即使在第二个片段中我使用android:nextFocusDown="@+id/..."
(因为我知道EditText第4和第5个有问题)它没用。
<强>解决方案强>
在我的情况下,解决方案非常简单,我必须像这样制作第二个片段事务:
mTransaction.replace(R.id...
mTransaction.addToBackStack(null);
mTransaction.commit();
如果有人有更好的建议,欢迎
第二个解决方案(2018年):
对于此question
我解决了这个问题,为片段布局的父ViewGroup
创建了一个自定义类。在自定义ViewGroup中,您可以覆盖方法
focusSearch(focused: View?, direction: Int)
添加此逻辑:
override fun focusSearch(focused: View?, direction: Int): View? {
val focusSearch = super.focusSearch(focused, direction)
if (direction == View.FOCUS_DOWN) when (focused?.id) {
R.id.some_view_that_has_focus -> return new_view_focus
}
if (findViewById<View>(focusSearch.id) == null) {//the view found is not part of this parent return null
return null
}
return focusSearch
}
当新的焦点视图不是此parent
的一部分而不是返回null时。当某些其他视图焦点无法访问时,我会在when
个案例中手动管理它。