2016-03-03 70 views
2

我的代碼:的setText()在afterTextChanged()顯示相反的順序文本

fractionNumEt.addTextChangedListener(new TextWatcher() { 

     boolean ignoreChange = false; 

     @Override 
     public void afterTextChanged(Editable s) { 
      if(!ignoreChange) { 
       String string = String.valueOf(s); 
       if (string.length() > 2) { 
        string = string.substring(0, string.length() - 1); 
        ignoreChange = true; 
        fractionNumEt.setText(string); 
        ignoreChange = false; 
       } 
      } 

     } 

....

我試圖限制字符長度2,但要保留聽力。當我輸入'1','2'時,它顯示「12」,這很好。現在當我輸入'3'時,它會寫入「31」而不是「23」。 這到底是怎麼回事! 我也試過:

string = string.substring(1, string.length()); 

在這種情況下,它的工作原理是第一次n只有再沒有什麼改變。

+0

爲什麼你使用 String string = String.valueOf(s); –

+0

忽略這一點,我只是與每一種可能性 – usman

+0

戰鬥,你可以使用String string = s.toString(); –

回答

2

這是發生setText(),EditText上的光標返回到第一位置,因爲之後。然後,任何新的號碼將被添加在字符串的乞討。

嘗試如下更新代碼:

@Override 
public void afterTextChanged(Editable s) { 
    if(!ignoreChange) { 
     String string = String.valueOf(s); 
     if (string.length() > 2) { 
      string = string.substring(0, string.length() - 1); 
      ignoreChange = true; 
      fractionNumEt.setText(string); 
      fractionNumEt.setSelection(fractionNumEt.getText().length()); 
      ignoreChange = false; 
     } 
    } 
} 

只是一個建議

檢查可編輯的文檔HERE

我覺得你並不需要將其轉換爲字符串。 afterTextChanged(Editable s)接收編輯作爲參數。您可以直接更改它。不需要將其轉換爲字符串。此外,您甚至不需要製作EditText.setText(),因爲可編輯內容的任何更改都會自動傳遞給EditText(因爲Android會調用afterTextChanged,並讓您有機會更新文本片刻之前在EditText中有效顯示該文本)。

也許,這樣的事情:

@Override 
public void afterTextChanged(Editable s) { 
    if(!ignoreChange) { 
     if(s.length() > 2) { 
      s.delete(s.length() - 1,s.length()); 
     } 
    } 
} 

玩可編輯的一點點,你會看到,它更容易。

+0

謝謝你!工作 – usman

+1

@usman我用一個建議更新我的答案。我認爲你不需要轉換爲字符串,你不需要使用EditText.setText()...只需修改您收到的Editable ... – W0rmH0le