Android EditText actionNext不';不能在碎片中工作

Android EditText actionNext不';不能在碎片中工作,android,android-fragments,android-edittext,focus,Android,Android Fragments,Android Edittext,Focus,我有一个片段包含5个编辑文本,前四个有actionNext最后一个有actionDone。我有一个问题,当我在第4个EditText并在软键盘中按next时,它会从第4个EditText中移除焦点,然后焦点消失,键盘仍然可见。当我按下键盘上的“下一步”按钮时,焦点转到第五个编辑文本,然后一切都正常进行 问题 当我在第4次编辑文本时,我必须按键盘上的actionNext2次才能到达第5次编辑文本 环境 我正在使用AppCompatActivity,Support fragments,EditTex

我有一个片段包含
5个编辑文本
,前四个有
actionNext
最后一个有
actionDone
。我有一个问题,当我在第4个EditText并在软键盘中按next时,它会从第4个EditText中移除焦点,然后焦点消失,键盘仍然可见。当我按下键盘上的“下一步”按钮时,焦点转到第五个编辑文本,然后一切都正常进行

问题

当我在第4次编辑文本时,我必须按键盘上的actionNext
2次才能到达第5次编辑文本

环境


我正在使用AppCompatActivity,Support fragments,EditText在android.Support.design.widget.TextInputLayout中,我使用AndroidAnnotations。

现在我找到了这个奇怪问题的解决方案,我发布它是为了帮助有同样问题的人或找到更好的建议:)

我的问题与碎片有关

我有一个活动,有两个片段。加载活动时,它会打开第一个带有replace事务的片段

mTransaction.replace(R.id.。

第一个片段有2个EditText。当用户单击第一个片段中的按钮时,活动将打开第二个片段,其中包含发生错误的5个EditText。这是我执行第二个片段事务的方式:

mTransaction.add(R.id...
mTransaction.addToBackStack(null);
mTransaction.commit();
这就是问题所在,因为当提交第二个片段时,我对片段事务使用
add
,这使得第一个片段留在容器中,所以这导致了我的bug

在我看来,第一个片段的EditText就在那里,它获得了关注,尽管在第二个片段中,我使用了
android:nextFocusDown=“@+id/…”
(因为我知道EditText第四和第五个片段有问题),但它不起作用

解决方案

在我的案例中,解决方案非常简单,我必须像这样进行第二个片段事务:

mTransaction.replace(R.id...
mTransaction.addToBackStack(null);
mTransaction.commit();
如果有人有更好的建议,我们欢迎

第二个解决方案(2018年):

为此

我解决了这个问题,为片段布局的父视图组创建了一个自定义类

focusSearch(聚焦:视图?,方向: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
}
override-fun-focusSearch(聚焦:视图?,方向:Int):视图{
val focusSearch=超级聚焦搜索(聚焦,方向)
如果(方向==视图.聚焦\向下)当(聚焦?.id){
R.id.some\u view\u拥有\u焦点->返回新的\u view\u焦点
}
如果(findviewbyd(focusSearch.id)==null){//找到的视图不是此父视图的一部分,则返回null
返回空
}
返回焦点搜索
}
当新的焦点视图不是父视图的一部分时,返回null。当无法访问其他视图焦点时,我在
When
案例中手动管理它