2011-03-01 6 views
5

을 추가하기 전에 텍스트가 설정되어 있다고하더라도 먼저 EditText에서 텍스트를 복구하고 TextWatcher를 추가합니다.TextWatcher는 안드로이드 액티비티에서 watcher

하지만 액티비티를 실행할 때 텍스트를 설정 한 후 감시자 자체가 추가 된 경우에도 afterTextChanged 메서드가 호출됩니다. 그래서 로그 출력은 TextWatcher에서 카운터가 호출되는 감시자 텍스트가 글고에서 설정 한 후에 추가 된 하나라는 것을 보여줍니다

 
onCreate: LifecycleMain 
Set text xyz 
// screen rotation 
onCreate: LifecycleMain 
Set text xyz 
afterTextChanged: xyz 2 

같은 것입니다. 왜 그런 일이 벌어지며 어떻게 막을 수 있니?

답변

1

이것은 반드시 발생해야합니다. savedinstanceState가 null이 아닌 경우 (이전 객체 상태가 저장됨을 의미) 텍스트를 설정 중입니다.

이 문제는 onCreate 메서드에서 EditText에 TextWatcher를 추가하고 다음에 onCreate가 호출되면 (예 : 구성 변경 후) TextWatcher가 이미 EditText에 추가 된 것을 발견했기 때문에 발생한다고 생각합니다.

이 상황을 확인하려면, 당신의 상태 전에를 넣어 :이 경우

if(savedInstanceState == null){ 
    Log.e("savedInstance state is null", "no text"); 
    et.setText("No text"); 
} 

를, 당신은 다음 afterTextChanged (편집 가능한들)이 호출되지 않습니다, 당신의 EditText에의 setText를 호출하는 경우.

+0

아니요. 액티비티가 처음 생성되었을 때 실제로 작동한다는 것이 사실이지만 EditText는 모든 감시자가없는 새 인스턴스가 될 때마다 있습니다. 나는 코드를 단순화하고 관찰자에게 카운터를 추가했다 : – SimonSays

+0

u는 editText et를 정적으로 정의 했는가? 그렇다면 이것이 이유 일 수 있습니다. 그리고 처음에는 f9로 언급 했으므로 문제는 probi를 사용하여 매번 작성하지 않는 edlText의 새 인스턴스 –

+0

죄송합니다. 끝내기 전에 내 의견이 업데이트되었습니다. 나는 위의 코드를 지금 업데이트했다. 나는 그것을 단순화하고 TextWatcher를위한 카운터를 추가했다. 당신이 볼 수있는 것은 활동이 처음 생성되었을 때 문제가 나타나지 않지만 두 번째로 나타납니다. 그러나 두 번째 TextWatcher 인스턴스가 호출됩니다. 첫 번째 인스턴스는 아닙니다. 또한 EditText는 감시자가 연결되지 않은 항상 새로운 인스턴스입니다. 및 아니오; EditText는 정적으로 정의되지 않습니다. – SimonSays

7

해결책은 addTextChangedListener를 onPostCreate 메서드로 이동하는 것입니다. 모두 해결 될 것이다.

+0

은 (단편에서) "isResumed()"를 확인하고이 경우에는 onTextChanged에만 응답하여 트릭을 수행하는 것처럼 편리했습니다. – hmac

+0

나를 위해 작동하지 않았습니다. –

관련 문제