2012-06-27 28 views
2

我得到運行這個特殊的代碼的StackOverflow的錯誤:安卓上的EditText TextChangedListener堆棧溢出錯誤

litera.addTextChangedListener(new TextWatcher(){ 
      public void afterTextChanged(Editable s) {} 
      public void beforeTextChanged(CharSequence s, int start, int count, int after){} 
      public void onTextChanged(CharSequence s, int start, int before, int count){ 
       String ghici = litera.getText().toString(); 
       System.out.println(ghici); 
       litera.setText(""); 
      } 

     }); 

我評論的每一行的時間和我發現,罪魁禍首是litera.setText(「」 );線,其他人正常工作。我之前使用它,它讓我困惑爲什麼一個特別簡單的指令會導致這樣一個錯誤的錯誤...其餘的錯誤信息是關於「android.view.ViewGroup.addFocusables(ViewGroup.java:637)」和其他人,但我懷疑他們是確鑿的。

我錯過了什麼?

+0

後全logcat的堆棧跟蹤 –

回答

2

u必須用這種方式

litera.addTextChangedListener(new TextWatcher(){ 
     public void afterTextChanged(Editable s) {} 
     public void beforeTextChanged(CharSequence s, int start, int count, int after){} 
     public void onTextChanged(CharSequence s, int start, int before, int count){ 
      String strEnteredVal = litera.getText().toString(); 
      if(!strEnteredVal.equals("")){ 
      System.out.println(strEnteredVal); 
      litera.setText(""); 
      } 
     } 

    }); 
+0

令人驚訝的是,這工作!我沒有得到上述代碼的區別(如何比較字符串「 「與字符串」「不同」),但它做了伎倆謝謝!:) – FloIancu

3

如果您在同一TextViewTextWatcher中設置了TextView的文本,則您設置了一個無限循環,導致StackOverflowException

+0

聽起來不錯。那麼我怎麼才能讓它在輸入每個字符後清除EditText?我想每次閱讀和處理一個角色(對於hang子手遊戲)。謝謝! – FloIancu

+0

然後使用['setFilters()'](http://developer.android.com/reference/android/widget/TextView.html#setFilters(android.text.InputFilter []))來代替。 –

0

您遇到此問題是因爲您正在更改onChange偵聽器中的文本。會發生什麼事是用戶更改文本,該文本調用onTextChange方法,該方法依次更改文本並再次調用onTextChange偵聽器 - 依此類推。如果您需要更改偵聽器中的文本,則需要以某種方式忽略代碼中的文本更改,並僅處理來自用戶的文本更改。例如,您可以嘗試如下所示:

litera.addTextChangedListener(new TextWatcher(){ 
     public void afterTextChanged(Editable s) {} 
     public void beforeTextChanged(CharSequence s, int start, int count, int after){} 
     public void onTextChanged(CharSequence s, int start, int before, int count){ 
      if(count > 0) { 
       String ghici = litera.getText().toString(); 
       System.out.println(ghici); 
       litera.setText(""); 
      } 
     } 
    }); 

這將忽略edittext內容已被刪除的所有更改(通過您的代碼)。

+0

它現在可以工作,但它不會像我想要的那樣擦除EditText。我想一次讀取和處理一個角色,以便進行hang子手遊戲,因此我需要它在每次輸入後擦除EditText,或者只允許輸入一個字符。我怎樣才能做到這一點? – FloIancu

+0

@FloIancu我更新了我的答案了一下。嘗試一下。 –

+0

你用if(!「」。等於(s))而不是if(在> 0之前)編輯會使堆棧再次溢出:( – FloIancu

0

您正在onTextChanged偵聽器中調用settext方法。這將導致偵聽器一次又一次地觸發onTextChanged方法。這是造成該計算器錯誤