2013-12-24 2 views
1

편집 텍스트에서 몇 가지 나쁜 단어를 삭제하고 싶습니다. 아버지 삼촌 사촌 왕은 F ** K가 될 것입니다. 그러나 문제는 내가 텍스트를 변경하면 처리기를 다시 변경하는 것입니다. 누구나 솔루션을 알고 있습니다. 도와주세요. 코드가 있습니다.EditText TextChangedListener에서 재귀를 제거하는 방법?

search_name.addTextChangedListener(new TextWatcher(){ 
     public void afterTextChanged(Editable s) { 
      search_name.setText(s.toString().replace("something", "s**ething")); 
      // here comes it repeatedly 
     } 
     public void beforeTextChanged(CharSequence s, int start, int count, int after){} 
     public void onTextChanged(CharSequence s, int start, int before, int count){} 
    }); 
+1

대신 InputFilter를 사용하십시오. – njzk2

+1

'InputFilter'에 대해서 알고 있지만 많은 경우이 재귀를 제거해야합니다. – pcbabu

+1

TextWatcher에서 setText를 호출 할 경우 재귀가 발생합니다. 재귀 루프에서 setText를 호출하지 않으려면 플래그를 사용하거나이 용도에 더 적합한 InputFilters를 사용할 수 있습니다. – njzk2

답변

0

변수로 해결했습니다.

int checker = 0; 
search_name.addTextChangedListener(new TextWatcher(){ 
     public void afterTextChanged(Editable s) { 
      checker = 0; 
     } 
     public void beforeTextChanged(CharSequence s, int start, int count, int after){} 
     public void onTextChanged(CharSequence s, int start, int before, int count){ 
      if(checker!=1) 
      {  
       checker = 1; 
       search_name.setText(s.toString().replace("something", "s**ething")); 
      } 
     } 
    }); 
2

나는 의견이 다시 njzk2 @ 동의 : 재귀 당신이 해결하려는 문제가있는 경우 InputFilter는, 당신이 그것을 방지하기 위해이 같은 일을 시도 할 수 있습니다 :

// make your TextWatcher a class variable 
protected TextWatcher mTextWatcher = new TextWatcher() 
    { 
     public void afterTextChanged(Editable s) { 
      textFixerUpper(search_name, s.toString()); 
     } 
     public void beforeTextChanged(CharSequence s, int start, int count, int after){} 
     public void onTextChanged(CharSequence s, int start, int before, int count){} 
    }; 


protected textFixerUpper(EditText t, String s) 
{ 
t.removeTextChangedListener(mTextWatcher);    // remove the listener 
t.setText(s.replace("something", "s**ething"));  // update the text 
t.addTextChangedListener(mTextWatcher);    // add the listener back 
} 

또는 부울을 설정하여 대신 리스너를 제거하고 다시 추가하는 대신 플래그를 사용하십시오.

+0

리스너를 제거하고 작업 후에 다시 추가 할 수 있습니다. 그러나 나는 이제 이것이 최선의 선택이라고 생각한다. – pcbabu

1

njzk2 @에서 가져온 아이디어는 당신이 afterTextChanged(e: Editable) 방법으로 제공 Editable 예를 통해 텍스트를 조작 할 수 있습니다 :

val textWatcher = object : TextWatcher { 
    override fun afterTextChanged(e: Editable) { 
     e.insert(0, "Hello World") 
     // e.delete(st, en) ... 
    } 

    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } 

    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { } 
} 

리스너 방법은이 시나리오에서 호출되지 않습니다.

관련 문제