2011-09-15 48 views
4

我有一個EditText和一個TextWatcher。在TextWatcher中更改文本後沒有更新EditText

的骷髏我的代碼:

EditText x; 
x.addTextChangedListener(new XyzTextWatcher()); 

XyzTextWatcher implements TextWatcher() { 
    public synchronized void afterTextChanged(Editable text) { 
     formatText(text); 
    } 
} 

我formatText()方法在文本的某些位置插入一些連字符。

private void formatText(Editable text) { 
    removeSeparators(text); 

    if (text.length() >= 3) { 
     text.insert(3, "-"); 
    } 
    if (text.length() >= 7) { 
     text.insert(7, "-"); 
    } 
} 

private void removeSeparators(Editable text) { 
    int p = 0; 
    while (p < text.length()) { 
     if (text.charAt(p) == '-') { 
      text.delete(p, p + 1); 
     } else { 
      p++; 
     } 
    } 
} 

我遇到的問題是 - 我的EditText上顯示的內容與Editable不同步。當我調試代碼時,我看到變量文本(可編輯)具有期望的值,但是EditText上顯示的內容並不總是與Editable相匹配。

例如,當我有一個文本 x =「123-456-789」 我從x手動刪除文本「456」。 格式化後,我可編輯的值爲「123-789-」 然而,在我的EditText顯示的數值爲「123--789」

他們在大多數情況下,相同的值,但。

我認爲EditText是可編輯的,它們應該始終匹配。我錯過了什麼嗎?

+0

你能顯示代碼? – slayton

+0

註釋中的代碼幾乎不可讀。您能否將代碼添加到代碼塊中的原始文章中,以便我可以閱讀它? – slayton

+0

@slayton對不起!我已將代碼添加到我的原始帖子中。謝謝。 – Karthz

回答

5

好吧,你從來沒有真正改變EditText只是可編輯。 Android EditTexts不是Editable類的子代。字符串是Editable類的子類。 onTextChangedListener不接受EditText作爲參數,而是接收EditText中顯示的Editable/String。在使用連字符格式化編輯後,您需要更新EditText。這樣的事情應該工作得很好:

class MyClass extends Activity{ 

    //I've ommited the onStart(), onPause(), onStop() etc.. methods 

    EditText x; 
    x.addTextChangedListener(new XyzTextWatcher()); 

    XyzTextWatcher implements TextWatcher() { 
     public synchronized void afterTextChanged(Editable text) { 
      String s = formatText(text); 
      MyClass.this.x.setText(s); 
     } 
    } 

} 

爲了防止放緩爲什麼不改變formatText方法是這樣的?

private Editable formatText(Editable text) { 
    int sep1Loc = 3; 
    int sep2Loc = 7; 

    if(text.length==sep1Loc) 
    text.append('-'); 

    if(text.length==sep2Loc) 
    text.append('-'); 

    return text; 
} 

注:在您更改的EditText /可編輯文本我沒有測試過這

+0

謝謝。我也嘗試過,它給了我預期的結果。但是,這大大減緩了投入。我不得不等待輸入每個數字。所以,我認爲這個想法是不正確的。 – Karthz

+0

這並不令人感到意外,因爲每次輸入新數字時,監聽器都會被調用。每次輸入數字時,您都不需要重新格式化字符串,只有當字符串達到特定長度時才行。嘗試將if子句放在格式化字符串中立即返回的formatText()方法的開頭太短或isn沒有合適的長度。 – slayton

+0

太好了,謝謝。我會嘗試一下,看看它是否更快。 – Karthz

相關問題