2010-09-13 119 views
0

我在EditText上设置了一个TextWatcher,它在用户键入数字后跟一个空格后更改输入类型。更改输入时,键盘不接受第一个字符

如果用户键入两个数字,则输入类型会切换并接受下一个字符,但如果用户只键入一个数字并按空格键,输入类型仍会更改,但不会接受用户尝试输入的第一个字符。

我已经在Froyo和1.6上测试过它,它只发生在Froyo上,它的工作原理应该是1.6。

下面的代码:

TextWatcher watcher = new TextWatcher() { 
    @Override 
    public void afterTextChanged (Editable s) { 
    } 

    @Override 
    public void beforeTextChanged (CharSequence s, int start, int count, int after) { 
    } 

    @Override 
    public void onTextChanged (CharSequence s, int start, int before, int count) {   
     // Parsed text holder is a class that just parses the EditText and pulls out various parts. 
     ParsedTextHolder th = parseTextHolder(s); 

     String newText = ""; 
     Boolean setTextKeyListener = false; 

     String tGetTextString = mQuery.getText().toString(); 

     if (!th.pFullMatch.equals("")) { 
      if (th.pFullMatch.length() == 2) { 
       mQuery.setKeyListener(new 
       TextKeyListener(TextKeyListener.Capitalize.SENTENCES, true)); 
       newText = tGetTextString + " for "; 
       setTextKeyListener = true; 
      } 
     } 

     if (setTextKeyListener) { 
      Log.i("setTextKeyListener", "true"); 
      if (mQuery.getKeyListener().getClass() != TextKeyListener.class) { 
        mQuery.setKeyListener(new TextKeyListener(TextKeyListener.Capitalize.SENTENCES, true)); 
      } else { 
        Log.d("setTextKeyListener", "skipped. already was text."); 
      } 

      if (!newText.equals("")) { 
        int position = newText.length(); 
        String ttext = newText; 
        newText = ""; 
        mQuery.setText(ttext, TextView.BufferType.EDITABLE); 
        mQuery.setText(ttext); 
        Editable text = mQuery.getEditableText(); 
        Log.w("setting selectiont to text: ", text.toString()); 
        Log.w("setting selectiont to position: ", Integer.toString(position)); 
        Selection.setSelection(text, position); 
        mQuery.setKeyListener(new TextKeyListener(TextKeyListener.Capitalize.SENTENCES, true)); 
      } 

     } 
    } 
}; 

而且,这里是一个APK,如果你想看到什么错误是这样的:http://endlesswhileloop.com/files/KeyboardBug.apk

回答

0

是mQuery的EDITTEXT正在观看?根据javadocs,您不应该在onTextChanged的EditText中对文本进行任何更改。所有这些更改应在afterTextChanged中进行。

通常,我已经结束了检查onTextChanged中的更改,然后完成afterTextChanged中更改的结果。你可以试试。

+0

刚试过使用afterTextChanged,没有运气。 感谢您的答案,但我没有意识到,编辑EditText在onTextChanged是不好的。 – tonyc 2010-09-13 17:14:59

+0

嗯,好吧,你为什么最后调用refreshDrawableState?这似乎有点骇人听闻,可能会导致不同版本的差异..(这只是一个猜测,但当你不得不强迫视图刷新你实际上只是掩盖了一个基本问题)。 – 2010-09-13 17:37:34

+0

啊,我有refreshDrawableState只是作为一个黑客,看看它是否会解决它,我删除了一堆无关紧要的东西,但仍然没有运气。 – tonyc 2010-09-13 20:42:23