Вопрос по android, android-edittext, textwatcher – android edittext onchange слушатель

95

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

EDIT: второй вопрос важнее Пожалуйста, ответьте на это.

попробуйте добавить слушатель фокуса, когда editText получает фокус, это означает, что пользователь начал его редактировать, а когда editText теряет фокус, это означает, что редактирование закончено Houcine

Ваш Ответ

7   ответов
186

вы можете увидеть, закончил ли пользователь редактирование текста, если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) {}
        });
    }
}

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

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

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

5

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

});
11

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

1

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

Так что звонитеonFocusChange(View v, boolean hasFocus) или добавьте кнопку и слушателя щелчка к ней.

11

ButterKnife, Вы можете использовать как:

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

}

Похожие вопросы