Андроид edittext onchange слушатель

Я немного знаю о TextWatcher, но это срабатывает на каждом персонаже, который вы вводите. Я хочу, чтобы слушатель запускался всякий раз, когда пользователь заканчивает редактирование. Является ли это возможным? Также в TextWatcher я получаю экземпляр Editable, но мне нужен экземпляр EditText. Как это получить?

EDIT: второй вопрос более важен. Ответьте на это.

Ответ 1

во-первых, вы можете увидеть, закончил ли пользователь редактировать текст, если EditText потеряет фокус или если пользователь нажимает кнопку завершения (это зависит от вашей реализации и от того, что подходит вам лучше всего). Во-вторых, вы не можете получить экземпляр EditText внутри textwatcher, только если вы объявили EditText как объект экземпляра. Даже если вы не должны редактировать EditText в textwatcher, потому что это не безопасно.

EDIT:

Чтобы получить экземпляр 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) {}
       });
    }

}

Обратите внимание, что приведенный выше пример может иметь некоторые ошибки, но я просто хотел показать вам пример.

Ответ 2

Любой, кто использует ButterKnife. Вы можете использовать как:

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

}

Ответ 3

Меня беспокоило, что внедрение слушателя для всех полей 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 после заданного

Ответ 4

Я сделал это с помощью 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());
    }

});

Ответ 5

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. И тогда он даст самое последнее значение.

Ответ 6

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

    }  
});  

Ответ 7

Насколько я могу судить об этом, есть только два способа сделать это. Как вы знаете, что пользователь закончил писать слово? Либо на фокус потеряли, либо нажав кнопку "ОК". На мой взгляд, вы не можете знать, что пользователь нажал последний символ...

Итак, позвоните onFocusChange(View v, boolean hasFocus) или добавьте к нему кнопку и прослушиватель кликов.