2015-02-04 2 views
0

afterTextChanged()은 언제든지 EditText 텍스트가 변경되고 (즉, 충돌이 발생한다는 것을 알았 음) 알아 냈습니다.하지만 문제를 해결하는 방법을 모르겠습니다. 아무도 도와주세요!TextWatchers afterTextChanged() 충돌 계속

편집 텍스트를 설정하고 EditText의 텍스트가 정확한지 addTextChangedListener

editText= (EditText) findViewById(R.id.editText); 
    editText.setInputType(InputType.TYPE_NULL); 
    editText.addTextChangedListener(textWatcher); 


    textWatcher = new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      //editText.removeTextChangedListener(textWatcher); //this doesn't help 
     } 

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

     } 

     @Override 
     public void afterTextChanged(Editable s) { 


      // Toast.makeText(mainAct, "OK",Toast.LENGTH_SHORT).show(); 


      String user_answer =editText.getText().toString(); 
      user_ans_int = Integer.parseInt(user_answer); 

이 확인해야 추가하고이 또한 어디에 (가 완벽하게 실행이 부분없이) 응용 프로그램이 충돌

  if (user_ans_int == answer){ 
       Toast.makeText(mainAct, "True", Toast.LENGTH_SHORT).show(); 
       editText.setText(""); 

      } 
      else { 
       Toast.makeText(mainAct, "Naaw - try again haha", Toast.LENGTH_SHORT).show(); 
       editText.setText("");//delete text after checking 
       tru = false; 
      } 


     } 

    }; 

} 
입니다
+1

여기에 예외 사항은 무엇입니까? – Amsheer

+0

오류가 발생하면 텍스트가 변경 될 때 호출되는 콜백의 텍스트가 변경됩니다. 끝없는 재귀가 발생합니다. 그것이 그 이유 일 것입니다. –

+0

나는 그것이 두 번째로 editText 내용을 분석하려고 할 때 실패하기 때문에 끝없는 재귀로 진행되지 않는다고 생각한다. 이 시점에서 내용은 ""이므로 Integer로 구문 분석 할 수 없으며 실패합니다. if ... else 문에서 텍스트를 숫자로 설정하면 제안한대로 끝나는 순환이 종료됩니다. – Thanos

답변

2

여기에 NumberFormatException이 표시됩니다. user_ans_int = Integer.parseInt(user_answer);editText에 None Number 값을 입력하고 afterTextChanged()을 호출했기 때문입니다.

user_ans_int = Integer.parseInt(user_answer); 

에 :

난 당신이 다음과 같은 코드를 변경할 수 있다고 생각 당신이에서는 if..else 문에서 텍스트를 업데이트 할 때 당신은 TextWatcher를 중지해야

try{ 
user_ans_int = Integer.parseInt(user_answer); 
}catch(NumberFormatException e){ 
    // A none number value is signed to your edittext, do something here. 
    return; 
} 
1

어디 정답을 확인하십시오. 지금 당신이하는 일은 대답이 맞는지 확인한 다음 텍스트를 다시 ""로 설정하는 것입니다. 텍스트가 변경 되었기 때문에 텍스트 감시자가 다시 트리거됩니다. 그런 다음 빈 문자열을 int로 구문 분석하려고합니다.

if (user_ans_int == answer){ 
    editText.removeTextChangedListener(textWatcher); 
    Toast.makeText(mainAct, "True", Toast.LENGTH_SHORT).show(); 
    editText.setText(""); 
    editText.addTextChangedListener(textWatcher); 
} else { 
    editText.removeTextChangedListener(textWatcher); 
    Toast.makeText(mainAct, "Naaw - try again haha", Toast.LENGTH_SHORT).show(); 
    editText.setText("");//delete text after checking 
    tru = false; 
    editText.addTextChangedListener(textWatcher); 
} 

실제로, 당신은 또한 예외를 잡기 위해 당신의 int로 EDITTEXT의 내용을 구문 분석에서는 try..catch 문을 배치 할 수 있지만이 경우 당신은 것입니다 : 그래서이에에서는 if..else 변경 그렇게하지 않고도 textWatcher를 호출하십시오. textWatcher를 사용하지 않도록 설정하고 다시 사용하는 것이 훨씬 더 효율적이라고 생각합니다.

+0

덕분에 나를 많이 도왔습니다! – xHero

0
 // Write down few code inside a afterTextChanged method 

     if(!s.equal("")){ 
     try { 
     String user_answer = s.getText().toString(); 
     user_ans_int = Integer.parseInt(user_answer); 
    } catch (NumberFormatException e) { 
     e.printStackTrace(); 
    } 

     }else{ 
      Toast.makeText(mainAct, "Please Enter Text",Toast.LENGTH_SHORT).show(); 
}