3

最近、Android アプリケーションに苦労しています。私のアプリケーションでは、各セルに EditText を含むアプリ コード内に動的に入力する TableLayout があり、ソフト キーボードの [次へ] ボタンが正しく動作しませんでした (同じ行の他のセルに移動する前に次の行にジャンプします)。 )。そこで、EditText に ID を割り当て、setNextFocusDownId メソッドを使用して次の EditText を指すことで、フォーカスの変更を手動でオーバーライドすることにしました。しかし、これもうまくいきませんでした。

状況を説明します。私のアプリには、次のように 3 つの列を持つ 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 で適切にソートされ、EditText 間のリンクは正常に行われます。
これをテストするために、ソフト キーボードの [次へ] ボタンを押したときに、いくつかの印刷トレースを配置しました。これは私が得るものです:

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

Samsung Galaxy S3 とエミュレーターの両方でテストしましたが、動作はまったく同じです。
あなたが私を助けてくれることを願っています!
お時間をいただきありがとうございます!

4

1 に答える 1

4

OK、いくつかの調査の後、最終的に解決策を見つけましたが、この動作の原因はわかりません.

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);
}
于 2013-01-13T15:05:47.553 に答える