2013-01-07 61 views
3

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

我会解释一下情况。 我的应用程序有三列的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时,我将EditText列表保存在名为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之间的联系被成功地完成。
为了测试这一点,我在按下软键盘中的下一步按钮时放置了一些打印痕迹。这就是我得到:

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和模拟器中都测试过,行为完全一样。
我希望你能帮助我!
谢谢你的时间!

回答

3

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

我不得不使用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); 
}