полей EditText андроид onChange, после чего слушатель



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



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

749   7  

7 ответов:

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

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

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

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

}

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

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

});

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

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

    }  
});  

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

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

Comments

    Ничего не найдено.