SetNextFocusDownId表现不正常

时间:2013-01-07 18:46:16

标签: android focus android-edittext android-softkeyboard next

我最近一直在努力使用我的Android应用程序。在我的应用程序中,我有一个TableLayout,我在应用程序代码中动态填充,包括每个单元格中的EditText,软键盘的“下一步”按钮行为不正确(跳到下一行,然后到达同一行中的其他单元格) )。所以我决定通过为EditTexts分配ID然后使用setNextFocusDownId方法指向下一个EditText来手动覆盖焦点更改。但这也不起作用。

我会解释一下情况。 我的应用程序有一个包含三列的TableLayout,这样:

EditText(1)      EditText(5)       EditText(10)
EditText(50)     EditText(100)     EditText(160)
EditText(500)    EditText(1000)    EditText(1600)
EditText(2500)   EditText(3000)    EditText(3500)
EditText(3800)   EditText(4000)    EditText(4500)

括号内的数字是EditText的ID。在填充此TableLayout时,我将EditTexts列表保存在名为focusList的ArrayList中,以便稍后分配NextFocus Id。填充表格后,我称之为:

private void manageFocusList() {
    for (int i=0; i<focusList.size()-1; i++){
        focusList.get(i).setImeOptions(0x05);
        focusList.get(i).setNextFocusDownId(focusList.get(i+1).getId());
    }

    focusList.get(focusList.size()-1).setImeOptions(0x06);

}

EditText列表在ArrayList中正确排序,并且EditTexts之间的链接已成功完成。
为了测试这一点,当我按下软键盘中的Next按钮时,我放了一些打印痕迹。这就是我得到的:

01-07 19:34:32.121: I/System.out(27287): My ID is: 1
01-07 19:34:32.121: I/System.out(27287): NextFocusDown: 5

01-07 19:34:32.521: I/System.out(27287): My ID is: 5
01-07 19:34:32.521: I/System.out(27287): NextFocusDown: 10

01-07 19:36:50.146: I/System.out(27287): My ID is: 10
01-07 19:36:50.146: I/System.out(27287): NextFocusDown: 50

依旧......

但是在应用程序中,它会以这种方式跳转:

1->5
5->50
50->100
100->160
160->1600
1600->1000
1000->500
500->2500

从现在开始,它继续做正确的

2500->3000
3000->3500
3500->3800
3800->4000
4000->4500

我在三星Galaxy S3和模拟器中进行了测试,行为完全相同 我希望你能帮帮我! 谢谢你的时间!

1 个答案:

答案 0 :(得分:4)

好的,经过一些研究,我终于找到了解决方案,但我不知道造成这种行为的原因。

我必须使用onEditorAction事件侦听器手动请求下一个edittext的焦点。我必须更改的代码中唯一的部分是manageFocusList()方法:

private void manageFocusList() {
    for (int i = 0; i < focusList.size() - 1; i++) {
        focusList.get(i).setImeOptions(5);
        final int nextId = focusList.get(i + 1).getId();
        focusList.get(i).setOnEditorActionListener(
                new OnEditorActionListener() {
                    @Override
                    public boolean onEditorAction(TextView v, int actionId,
                            KeyEvent event) {
                        if (actionId == EditorInfo.IME_ACTION_NEXT){
                            ((EditText) findViewById(nextId)).requestFocus();
                            return true;
                        }                               
                        return false;
                    }
                });
    }
    focusList.get(focusList.size() - 1).setImeOptions(6);
}