android edittext onchange прослушиватель

115

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

РЕДАКТИРОВАТЬ : второй вопрос важнее. Пожалуйста, ответьте на это.

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

Ответы:

215

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

РЕДАКТИРОВАТЬ:

Чтобы включить 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) {}
        });
    }
}

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

Ката
источник
18

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

RNGuy
источник
У меня это работает очень хорошо, экономит много строк кода! Ты гений!
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());
    }

});
AndroidGeek
источник
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. И тогда будет указано самое последнее значение.

user2566490
источник
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, заменив! ComS (dat.s, "" + EdTe.getText ()) функцией! Equal. Однако сама функция equal некоторое время работает некорректно во время выполнения.

Слушатель onChange запомнит старые данные EditText при вводе фокуса пользователя, а затем сравнит новые данные, когда пользователь потеряет фокус или перейдет к другому вводу. Если сравнивать старую строку с той же новой строкой, она запускает работу.

Если у вас есть только 1 EditText, тогда вам нужно будет создать функцию ClearFocus, сделав Ultimate Secret Transparent Micro EditText 😸 вне окон 😽 и запросить фокус на нем, а затем скрыть клавиатуру с помощью диспетчера методов импорта.

phnghue
источник