android edittext onchange listener


115

나는 조금 알고 TextWatcher있지만 그것은 당신이 입력하는 모든 캐릭터에서 발생합니다. 사용자가 편집을 마칠 때마다 실행되는 리스너를 원합니다. 가능할까요? 또한 TextWatcher인스턴스를 Editable얻지 만 인스턴스가 필요합니다 EditText. 어떻게 얻습니까?

편집 : 두 번째 질문이 더 중요합니다. 대답 해주세요.


1
포커스 리스너를 추가하려고하면 editText가 포커스를
받으면

답변:


214

첫째, 사용자 EditText가 포커스를 잃었거나 완료 버튼을 눌렀을 때 사용자가 텍스트 편집을 완료했는지 확인할 수 있습니다 (이는 구현 및 가장 적합한 항목에 따라 다름). 둘째,을 인스턴스 객체로 선언 한 경우에만 에서 EditText인스턴스를 가져올 수 없습니다 . 안전하지 않기 때문에 내부를 편집해서는 안됩니다 .TextWatcherEditTextEditTextTextWatcher

편집하다:

EditText인스턴스를 TextWatcher구현 으로 가져 오려면 다음과 같이 시도해야합니다.

public class YourClass extends Activity {

    private EditText yourEditText;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
        yourEditText = (EditText) findViewById(R.id.yourEditTextId);

        yourEditText.addTextChangedListener(new TextWatcher() {

            public void afterTextChanged(Editable s) {

                // you can call or do what you want with your EditText here

                // yourEditText... 
            }

            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

            public void onTextChanged(CharSequence s, int start, int before, int count) {}
        });
    }
}

위의 샘플에는 약간의 오류가있을 수 있지만 예를 보여 드리고자합니다.


17

모든 EditText 필드에 대한 리스너를 구현하려면 추악하고 장황한 코드가 필요했기 때문에 아래 클래스를 작성했습니다. 이것에 걸려 넘어지는 사람에게 유용 할 수 있습니다.

public abstract class TextChangedListener<T> implements TextWatcher {
    private T target;

    public TextChangedListener(T target) {
        this.target = target;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

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

    @Override
    public void afterTextChanged(Editable s) {
        this.onTextChanged(target, s);
    }

    public abstract void onTextChanged(T target, Editable s);
}

이제 리스너를 구현하는 것이 조금 더 깔끔합니다.

editText.addTextChangedListener(new TextChangedListener<EditText>(editText) {
            @Override
            public void onTextChanged(EditText target, Editable s) {
                //Do stuff
            }
        });

얼마나 자주 발생하는지에 관해서 //Do stuff는 주어진 a 가 발생한 후에 원하는 코드를 실행하기위한 검사를 구현할 수 있습니다 .


이것은 나를 위해 매우 잘 작동하고 많은 코드 라인을 절약합니다! 당신은 천재입니다!
huypham99

12

ButterKnife를 사용하는 모든 사람 . 다음과 같이 사용할 수 있습니다.

@OnTextChanged(R.id.zip_code)
void onZipCodeTextChanged(CharSequence zipCode, int start, int count, int after) {

}

6

나는 그것을 사용하여했다 AutotextView:

AutotextView textView = (AutotextView) findViewById(R.id.autotextview);
textView.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
        seq = cs;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int arg1, int arg2, int arg3) {

    }

    @Override
    public void afterTextChanged(Editable arg0) {
        new SearchTask().execute(seq.toString().trim());
    }

});

3
 myTextBox.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) {  

    TextView myOutputBox = (TextView) findViewById(R.id.myOutputBox);  
    myOutputBox.setText(s);  

    }  
});  

2
끝에 불필요한}이 하나 있습니다
Howard

2

TextWatcher 그것은 모든 것을 위해 계속 발사했기 때문에 나를 위해 일하지 않았습니다. EditText 하고 서로의 가치를 엉망 .

내 해결책은 다음과 같습니다.

public class ConsultantTSView extends Activity {
    .....

    //Submit is called when I push submit button.
    //I wanted to retrieve all EditText(tsHours) values in my HoursList

    public void submit(View view){

        ListView TSDateListView = (ListView) findViewById(R.id.hoursList);
        String value = ((EditText) TSDateListView.getChildAt(0).findViewById(R.id.tsHours)).getText().toString();
    }
}

따라서 getChildAt(xx)메서드를 사용하여에서 모든 항목을 검색 ListView하고을 사용하여 개별 항목을 가져올 수 findViewById있습니다. 그런 다음 가장 최근 값을 제공합니다.


1

내가 생각할 수있는 한, 할 수있는 방법은 두 가지뿐입니다. 사용자가 단어 쓰기를 완료했는지 어떻게 알 수 있습니까? 포커스를 잃거나 "확인"버튼을 클릭합니다. 내 마음에 사용자가 마지막 문자를 눌렀는지 알 수있는 방법은 없습니다 ...

따라서 onFocusChange(View v, boolean hasFocus)버튼과 클릭 리스너를 호출 하거나 추가합니다.


0

Watcher 메서드는 모든 문자 입력에 대해 실행됩니다. 따라서 onFocusChange 메서드를 기반으로이 코드를 작성했습니다.

public static boolean comS(String s1,String s2){
    if (s1.length()==s2.length()){
        int l=s1.length();
        for (int i=0;i<l;i++){
            if (s1.charAt(i)!=s2.charAt(i))return false;
        }
        return true;
    }
    return false;
}

public void onChange(final EditText EdTe, final Runnable FRun){
    class finalS{String s="";}
    final finalS dat=new finalS();  
    EdTe.setOnFocusChangeListener(new OnFocusChangeListener() {          
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {dat.s=""+EdTe.getText();}
            else if (!comS(dat.s,""+EdTe.getText())){(new Handler()).post(FRun);}       
        }
    });
}

그것을 사용하려면 다음과 같이 호출하십시오.

onChange(YourEditText, new Runnable(){public void run(){
    // V  V    YOUR WORK HERE

    }}
);

! comS (dat.s, ""+ EdTe.getText ())를! equal 함수로 바꾸면 comS 함수를 무시할 수 있습니다. 그러나 동등한 함수 자체는 런타임에서 올바르게 작동하지 않습니다.

onChange 리스너는 사용자가 입력 할 때 EditText의 이전 데이터를 기억하고 사용자가 초점을 잃거나 다른 입력으로 이동할 때 새 데이터를 비교합니다. 이전 문자열을 새 문자열과 동일하지 않으면 작업을 시작합니다.

EditText가 1 개뿐이면 Ultimate Secret Transparent Micro EditText 😸를 창 외부에 만들어 ClearFocus 기능을 만들고 😽에 포커스를 요청한 다음 Import Method Manager를 통해 키보드를 숨겨야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.