5

在我的Android應用程序中,我需要實現一個TextWatcher接口來實現onTextChanged。我遇到的問題是,我想用一些額外的字符串更新相同的EditText。當我嘗試這樣做時,程序終止。如何使用TextWatcher更新相同的EditText?

final EditText ET = (EditText) findViewById(R.id.editText1); 
ET.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) 
     { 
      try 
      { 
       ET.setText("***"+ s.toString()); 
       ET.setSelection(s.length()); 
      } 
      catch(Exception e) 
      { 
       Log.v("State", e.getMessage()); 
      } 
     } 

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

     } 

     @Override 
     public void afterTextChanged(Editable s) 
     {    
     } 
    }); 

我的程序終止,甚至我試圖捕捉異常,就像我的代碼仍然會終止。 有沒有人有任何想法,爲什麼會發生這種情況,我怎麼能做到這一點?謝謝。

+1

'當我嘗試做這個節目terminates.'這基本上意味着,您應該提供可以在LogCat中找到的堆棧跟蹤。這對我們有很大幫助! – WarrenFaith 2012-02-29 11:54:41

回答

8

TextView的內容是不可編輯的上的onTextChanged事件。

相反,您需要處理afterTextChanged事件才能對文本進行更改。

更徹底的說明,請參見:Android TextWatcher.afterTextChanged vs TextWatcher.onTextChanged


注意:錯誤onTextChanged

Obvioulsy,你是在afterTextChanged事件連續改變文本造成死循環。

the ref

公共抽象無效afterTextChanged(編輯S)
這種方法被調用來通知您,內部的某個地方,該文本已 改變。從此 回調中對s進行進一步更改是合理的,但請注意不要陷入無限循環 ,因爲您所做的任何更改都會導致此方法以遞歸方式再次調用 。 ...

  • 建議1:如果可以,檢查s已經你想在觸發事件是什麼。

    @Override 
    public void afterTextChanged(Editable s) 
    {  
        if(!s.equalsIngoreCase("smth defined previously")) 
         s = "smth defined previously";    
    } 
    
  • 建議2:如果您需要做更復雜的東西(格式化, 驗證)你也許可以使用​​方法就像this post.

注2:將輸入格式化爲部分隱藏n星星直到最後 cha RS(****爲四個)

您可以使用這樣的事情在建議1

@Override 
    public void afterTextChanged(Editable s) 
    {  
     String sText = ET.getText().toString() 

     if(!isFormatted(sText)) 
      s = format(sText);    
    } 
    bool isFormatted(String s) 
    { 
    //check if s is already formatted 
    } 

    string format(String s) 
    { 
     //format s & return 
    } 
+0

HI Zorkun,我試圖在afterTextChanged(可編輯的)事件中添加相同的代碼...仍然終止...你知道任何其他的替代方法嗎?謝謝 – JibW 2012-02-29 11:30:42

+0

s可在afterTextChanged(可編輯)內編輯。但它仍然不能分配給EditText。 – JibW 2012-02-29 11:41:54

+0

是的這是真的。它通過不斷更改afterTextChanged事件上的文本而導致無限循環。事情是,我想隱藏EditText中的第一個字母,用一些字符作爲*,並且只讓最後4個字符可見... – JibW 2012-02-29 13:09:18

1

爲了補充Zortkun's answer(其中示例代碼是相當壞),你這是怎麼會使用afterTextChanged()更新同一EditText

editText.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {  
    } 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) {  
    } 

    @Override 
    public void afterTextChanged(Editable editable) {   
     if (!editable.toString().startsWith("***")) { 
      editable.insert(0, "***"); 
     }   
    } 
}); 

熟悉的Editable接口,以瞭解其他操作除了insert()

注意,很容易在一個無限循環結束了(你再次觸發afterTextChanged()的變化),所以通常你如果條件,如上面做更改內的。

由於afterTextChanged()javadocs說:

它是合法的,從這個回調使送進一步的變化,但 要小心,不要讓自己陷入死循環,因爲任何 更改都將導致此方法遞歸地再次調用 。

0

遲到的答案,如果有人看這是我是如何做到的。

  • 集通話一回最初
  • addTextChangedListener(說onTextChanged())刪除addTextChangedListener
  • 仍有意接收更新重新添加。

這裏是代碼。

editText.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      Log.d("log", "before"); 
     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

      Log.d("log", "after"); 
      editText.removeTextChangedListener(this); 

      ediText.setText("text you wanted to put"); 

      editText.addTextChangedListener(this); 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 


     } 
    }); 
0

這裏是一個片段,對我來說

etPhoneNumber.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) {} 

     @Override 
     public void afterTextChanged(Editable s) { 
      if (!s.toString().equals(Utils.getFormattedNumber(s.toString()))) { 
       s.replace(0, s.length(), Utils.getFormattedNumber(s.toString())); 
      } 
     } 
    }); 

工作,在那裏Utils.getFormattedPhoneNumber()是你的方法返回一個格式化的數字

相關問題