2013-03-28 5 views
3

안드로이드의 TextWatcher와 작업하고 있습니다. 사용자가 타이핑 한 것을 저장하고 저장 한 후에 Edittext에서 문자를 변경합니다. 예를 들어 "hi im happy"와 같은 상수 텍스트가 있고 edittext 사용자가 입력 한 모든 내용은이 텍스트가 쓰여지고 있음을 알 수 있습니다 (이 문자열은 사용자가 타이핑하는 동안 직렬 식으로 표시됩니다)! 사용자가 입력하고 변수에 저장되는 주 텍스트입니다. 나는 afterTextChanged 내부 코드를 사용 안드로이드의 텍스트 워처 내에서 두번 실행하지 못하도록

if(s.toString().charAt(s.length()-1) != 'a'){ 
    //save inside freaktext variable(append) 
    freaktext=freaktext+s.toString().charAt(s.length()-1); 

     //change edittext value(what user see's) 
    txtfreak.setText(s.toString().substring(0, s.length()-1) + "a"); 
    txtfreak.setSelection(txtfreak.getText().length()); 
}else{ 
    freaktext=freaktext+"a"; 
} 

내가 입력 한 문자가 "freaktext"라는 변수에 저장하고 글고 값을 변경하고 "A"문자를 넣어, "A"가 아닌 경우 내가 말할이 코드 edittext 안에있는 문자열의 끝. 하지만 사용자가 "a"를 입력하면 freaktext에 저장됩니다.

내 문제는 : 사용자가 "a"문자를 입력하지 않으면 모든 것이 잘 작동하고 내 코드는 입력 된 문자를 저장 한 다음 edittext 값을 수정하지만 edittext 값이 변경되면 전체 코드가 다시 실행되고 마지막으로 변경하기 때문에 "a"를 입력하면 코드의 두 번째 부분 (else)이 실행되고 저장된 문자열의 끝에 "a"를 다시 저장합니다. 사실 "q"라고 입력하면 저장된 문자열에 "qa"가 표시됩니다. 나는 그저 키보드에 "a"를 직접 입력하고 "a"를 저장하고 다른 상황에서는 저장하지 않기를 바란다. 사실 내 else 섹션은 ​​사용자가 직접 키보드의 "a"키를 눌렀을 때만 실행됩니다.이 작업을 수행 할 수 있습니까? 나,이 코드는 어딘가에, 일일

함수 외부

답변

3

내 시간을 낭비 도와주세요 :

boolean weChangedIt = false; 

afterTextChanged 내부의

if (weChangedIt) { 
    weChangedIt = false; 
} else { 
    if(s.toString().charAt(s.length()-1) != 'a'){ 
     weChangedIt = true; 
     freaktext=freaktext+s.toString().charAt(s.length()-1); 
     txtfreak.setText(s.toString().substring(0, s.length()-1) + "a"); 
     txtfreak.setSelection(txtfreak.getText().length()); 
    }else{ 
     freaktext=freaktext+"a"; 
    } 
} 
+0

와우! 고맙습니다. 나는이 방법을 여러 번 시도했지만 문제가 생길 때마다 내 코드가 아름답고 잘 포맷 된 적이 없었습니다. 하지만 코드가 잘 작동하고 내 친구에게 감사하고 싶습니다! :) – Fcoder

1
txtfreak.removeTextChangedListener(whateveryourlistenername); 
if(s.toString().charAt(s.length()-1) != 'a'){ 
freaktext=freaktext+s.toString().charAt(s.length()-1); 
txtfreak.setText(s.toString().substring(0, s.length()-1) + "a"); 
txtfreak.setSelection(txtfreak.getText().length()); 

}else{ 
freaktext=freaktext+"a"; 
} 
txtfreak.addTextChangedListener(whateveryourlistenername); 
+0

+1 좋은 답변. 또한'whateveryourlistenername' 대신'this'를 사용할 수도 있습니다. – Tushar

+0

나는 청취자를 위해 그가 무엇을 가지고 있는지 알지 못했고, 클래스를 가질 수 있었다. TextWatcher –

+0

그가'Editable'을 다른 함수로 전달하지 않았다면, 그의 클래스가'구현 된'TextWatcher인지 또는 익명의 내부인지 수업. – Tushar