EditText actionNext在片段内不起作用

时间:2015-07-07 00:07:20

标签: android android-fragments android-edittext focus

我有一个包含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。

1 个答案:

答案 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个案例中手动管理它。