2010-09-13 87 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