0

我有两个 editText 字段,在他们自己的 addTextChangedListeners 中跟随 TextWatchers。输入已正确读取和处理,但我输入的数字根本没有显示在第二个字段 (editText2) 的显示屏上(即使我在 afterTextChanged() 中等待 (sleep()) 一段时间,然后继续设置两个字段的值到空结束设置焦点到第一个字段。

在第一个字段中输入数字时会发生什么:数字显示在字段中,焦点移到第二个字段。在第二个字段中输入数字会发生什么情况:光标(闪烁的垂直线)被冻结,两秒钟后不显示任何数字:光标移动到第一个字段并且两个字段都为空。所有这一切都是为了发生,除了应该显示在第二个字段中输入的数字,然后系统应该冻结显示该数字一段时间,然后设置为 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 回答