android edittext OnChange listener

Wiem trochę o TextWatcher ale to działa na każdą postać, w którą wejdziesz. Chcę mieć słuchacza, który odpala się, gdy użytkownik zakończy edycję. Czy to możliwe? Również w TextWatcher otrzymuję instancję Editable, ale potrzebuję instancji EditText. Jak to zdobyć?

edytuj: drugie pytanie jest ważniejsze. Proszę, odpowiedz.

Author: prongs, 2012-06-21

7 answers

Po pierwsze, możesz zobaczyć, czy użytkownik zakończył edycję tekstu, jeśli EditText straci fokus lub jeśli użytkownik naciśnie przycisk Gotowe (zależy to od twojej implementacji i od tego, co pasuje najlepiej dla Ciebie). Po drugie, nie można uzyskać instancji EditText wewnątrz TextWatcher tylko wtedy, gdy zadeklarowano EditText jako obiekt instancji. Chociaż nie powinieneś edytować EditText W TextWatcher, ponieważ nie jest to bezpieczne.

EDIT:

Aby móc pobrać instancję EditText do twojego TextWatcher implementacja, powinieneś spróbować czegoś takiego:

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

Zauważ, że powyższa próbka może mieć pewne błędy, ale chciałem tylko pokazać przykład.

 171
Author: Cata,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-10 05:33:46

Każdy, kto używa ButterKnife . Możesz użyć jak:

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

}
 10
Author: Prakash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-17 17:05:01

Martwiło mnie to, że implementacja listenera dla wszystkich moich pól EditText wymagała ode mnie brzydkiego, wyrazistego kodu, więc napisałem poniższą klasę. Może się przydać każdemu, kto się na to natknie.

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

Teraz implementacja słuchacza jest trochę czystsza.

editText.addTextChangedListener(new TextChangedListener<EditText>(editText) {
            @Override
            public void onTextChanged(EditText target, Editable s) {
                //Do stuff
            }
        });

Jeśli chodzi o to, jak często się odpala, można by zaimplementować sprawdzanie, aby uruchomić żądany kod w //Do stuff po danym a

 9
Author: RNGuy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-21 19:05:54

Zrobiłem to używając 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
Author: Xar E Ahmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-14 15:40:41

TextWatcher nie zadziałało na mnie, ponieważ strzelało do każdego EditText i psowało sobie nawzajem wartości.

Oto moje rozwiązanie:

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

Stąd za pomocą metody getChildAt(xx) można pobrać dowolny element w ListView i uzyskać pojedynczy element za pomocą findViewById. A następnie poda najnowszą wartość.

 2
Author: user2566490,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-05 16:24:22
 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
Author: Ramesh sambu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-19 03:17:37

Jeśli o tym myślę, są tylko dwa sposoby, żeby to zrobić. Skąd możesz wiedzieć, że użytkownik skończył pisać słowo? Albo po utracie ostrości, albo kliknięciu przycisku "ok". Nie ma mowy, żebyś wiedział, że użytkownik nacisnął ostatni znak...

Więc zadzwoń onFocusChange(View v, boolean hasFocus) lub Dodaj przycisk i kliknij do niego.

 1
Author: Nuno Gonçalves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-21 08:21:48