code

android edittext onchange listener

codestyles 2020. 8. 20. 18:47
반응형

android edittext onchange listener


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

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


첫째, 사용자 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) {}
        });
    }
}

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


모든 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 발생한 후에 원하는 코드를 실행하기위한 검사를 구현할 수 있습니다 .


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

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

}

나는 그것을 사용하여했다 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());
    }

});

 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);  

    }  
});  

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();
    }
}

Hence by using the getChildAt(xx) method you can retrieve any item in the ListView and get the individual item using findViewById. And it will then give the most recent value.


As far as I can think bout it, there's only two ways you can do it. How can you know the user has finished writing a word? Either on focus lost, or clicking on an "ok" button. There's no way on my mind you can know the user pressed the last character...

So call onFocusChange(View v, boolean hasFocus) or add a button and a click listener to it.

참고URL : https://stackoverflow.com/questions/11134144/android-edittext-onchange-listener

반응형