3

我最近一直在为我的 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 和模拟器中都进行了测试,结果完全一样。
我希望你能帮帮我!
感谢您的时间!

4

1 回答 1

4

好的,经过一番研究,我终于找到了解决方案,但我不知道是什么导致了这种行为。

我必须使用 onEditorAction 事件侦听器手动请求下一个编辑文本的焦点。我必须更改的代码的唯一部分是 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);
}
于 2013-01-13T15:05:47.553 回答