EditText actionNext 在片段内部不起作用

EditText actionNext doesn't work inside fragments

我有一个包含 5 EditTexts 的片段,前四个 actionNext 最后一个 actionDone。我有一个问题,当我在 4-th EditText 并在软键盘中按下一步时,它会从第 4 个 EditText 中删除焦点,并且焦点无处可去,键盘仍然可见。当我按下键盘上的下一个按钮时,焦点转到 5-th EditText,然后一切正常。

问题

当我在 4-th EditText 时,我必须按键盘上的 actionNext 2 times 才能到达 5-th EditText。

环境

我用的是AppCompatActivity,支持fragments,里面有EditTextandroid.support.design.widget.TextInputLayout,我用的是AndroidAnnotations。

现在我找到了这个奇怪问题的解决方案,我将其发布以帮助遇到相同问题的任何人或找到更好的建议:)

我的问题与碎片有关。

我有一个 activity 有 2 个碎片。加载 activity 后,它会打开第一个片段并替换事务

mTransaction.replace(R.id...

第一个片段有 2 个 EditText。当用户单击第一个片段中的按钮时,activity 打开第二个片段,其中包含发生错误的 5 个 EditText。这就是我进行第二个片段交易的方式:

mTransaction.add(R.id...
mTransaction.addToBackStack(null);
mTransaction.commit();

这就是问题所在,因为当提交第二个片段时,我使用 add 进行片段事务,这使得第一个片段留在容器中,所以这导致了我的错误。

在我看来,第一个片段的 EditText 在那里并且获得了焦点,即使在第二个片段中我使用了 android:nextFocusDown="@+id/..."(因为我知道 EditText 4-th 和 5-th 有问题) 它没有用。

解决方案

我的解决方案非常简单,我必须像这样进行第二个片段交易:

mTransaction.replace(R.id...
mTransaction.addToBackStack(null);
mTransaction.commit();

如有更好的建议欢迎

第二种方案(2018):

For this

我解决了这个问题,为片段布局的父 ViewGroup 创建自定义 class。在您的自定义 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 时比 return 为空。当无法访问其他一些视图焦点时,我会在 when 个案例中手动管理它。