0

2つのeditTextフィールドがあり、独自のaddTextChangedListenersに次のTextWatchersがあります。入力は正しく読み取られて処理されますが、入力した数値は2番目のフィールド(editText2)のディスプレイに表示されません(両方のフィールドの値の設定に進む前にしばらく待っても(afterTextChanged()のsleep())) nullに終了すると、最初のフィールドにフォーカスが設定されます。

最初のフィールドに数値を入力すると、数値がフィールドに表示され、フォーカスが2番目のフィールドに移動します。2番目のフィールドに数字を入力するとどうなりますか:カーソル(垂直線の点滅)がフリーズし、数字が表示されなくなります。2秒後:カーソルが最初のフィールドに移動し、両方のフィールドがすべて空になります。これはすべて、2番目のフィールドに入力された数値が表示され、システムがしばらくの間その数値を表示してからnullに設定され、最初のフィールドに移動することを除いて発生することを意味します。

何が問題で、どのように解決するのですか?

public class Spel extends FragmentActivity  {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.spel);

    editText1 = (EditText) findViewById(R.id.editText1);
editText1.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence s, int start,
            int before, int count) {
        if (before==0) {  // alleen doen als editText1 leeg was
            String v = s.toString();
            if (v.equals("0") || v.equals("1") || v.equals("2") || v.equals("3") || v.equals("4") || v.equals("5") || v.equals("6") || v.equals("7") || v.equals("8") || v.equals("9")) {
                editText2.requestFocus();
                int baanWorpScore = Integer.parseInt(v);
                banenWorpScore[0] = baanWorpScore;
            } 
            else {
                // blijf wachten op goede invoer
                editText1.setText(null);
            }                       
        }

    }
});


    editText2 = (EditText) findViewById(R.id.editText2);
    editText2.addTextChangedListener(new TextWatcher() {

@Override
public void afterTextChanged(Editable s) {
    // TODO Auto-generated method stub
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

    @Override
    public void onTextChanged(CharSequence s, int start,
        int before, int count) {
    if (before==0) {
        String v = s.toString();
        if (v.equals("0") || v.equals("1") || v.equals("2") || v.equals("3") || v.equals("4") || v.equals("5") || v.equals("6") || v.equals("7") || v.equals("8") || v.equals("9")) {
            editText1.requestFocus();
            editText1.setText(null);
            editText2.setText(null);
            int baanWorpScore = Integer.parseInt(v);
            banenWorpScore[1] = baanWorpScore;
        } 
        else {
            // blijf wachten op goede invoer
            editText2.setText(null);
        }
    }
});
}
4

1 に答える 1

0

次の解決策が見つかり、遅延操作を実行可能に入れ、(新しい)ハンドラーのメソッドpostDelayedに渡されました。これはまさに私が望んでいたことを行います。解決策を探す場所を見つけるのに役立った投稿については、こちらを参照してください。

(メソッドremoveCallbacksを実際に呼び出す必要があるかどうかは実際にはわかりません)

@Override
public void onTextChanged(CharSequence s, int start,
        int before, int count) {

    Runnable mFilterTask = new Runnable() {

         @Override
         public void run() {
                editText1.setText(null);
                editText2.setText(null);
                editText1.requestFocus();
         }       
    };

    Handler mHandler = new Handler();

    if (before==0) {
        String v = s.toString();
        if (v.equals("0") || v.equals("1") || v.equals("2") || v.equals("3") || v.equals("4") || v.equals("5") || v.equals("6") || v.equals("7") || v.equals("8") || v.equals("9")) {
            mHandler.removeCallbacks(mFilterTask); 
            mHandler.postDelayed(mFilterTask, 2000);

            int baanWorpScore = Integer.parseInt(v);
            banenWorpScore[1] = baanWorpScore;
        } 
    }
}
于 2013-02-07T13:49:42.537 に答える