web-dev-qa-db-fra.com

android ecouteur edittext onchange

Je connais un peu la TextWatcher mais cela se déclenche sur tous les personnages que vous entrez. Je veux un auditeur qui se déclenche chaque fois que l'utilisateur termine l'édition. C'est possible? Également dans TextWatcher je reçois une instance de Editable mais il me faut une instance de EditText. Comment puis-je l'obtenir?

EDIT: la deuxième question est plus importante. S'il vous plaît répondre à cela.

99
prongs

Tout d'abord, vous pouvez voir si l'utilisateur a fini de modifier le texte si la EditText perd le focus ou si l'utilisateur appuie sur le bouton Terminé (cela dépend de votre implémentation et de ce qui vous convient le mieux). Deuxièmement, vous ne pouvez pas obtenir une instance EditText dans la TextWatcher uniquement si vous avez déclaré la EditText en tant qu'objet d'instance. Même si vous ne devriez pas éditer le EditText dans le TextWatcher parce que ce n’est pas sûr.

EDIT:

Pour pouvoir obtenir l'instance EditText dans votre implémentation TextWatcher, vous devez essayer quelque chose comme ceci:

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

Notez que l'exemple ci-dessus peut contenir des erreurs, mais je voulais simplement vous montrer un exemple.

192
Cata

Cela me dérangeait que d'implémenter un écouteur pour tous mes champs EditText m'obligeait à avoir un code vilain et prolixe, alors j'ai écrit la classe ci-dessous. Peut être utile à quiconque trébuche sur ceci.

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

Maintenant, implémenter un auditeur est un peu plus propre.

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

Quant à la fréquence de déclenchement, on pourrait éventuellement mettre en place une vérification pour exécuter le code souhaité dans //Do stuff après une période donnée.

13
RNGuy

Toute personne utilisant ButterKnife. Vous pouvez utiliser comme:

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

}
12
Prakash

Je l'ai fait en utilisant 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());
    }

});
6
Xar E Ahmer
 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);  

    }  
});  
3
Ramesh sambu

TextWatcher n'a pas fonctionné pour moi, car il continuait à tirer pour chaque EditText et à déranger les valeurs de chacun.

Voici ma solution:

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

Par conséquent, en utilisant la méthode getChildAt(xx), vous pouvez récupérer n'importe quel élément de la variable ListView et obtenir l'élément individuel à l'aide de findViewById. Et cela donnera alors la valeur la plus récente.

2
user2566490

Autant que je sache, il n'y a que deux façons de le faire. Comment savoir que l'utilisateur a fini d'écrire un mot? Soit la mise au point perdue, soit en cliquant sur un bouton "ok". Dans mon esprit, vous ne pouvez pas savoir que l'utilisateur a appuyé sur le dernier caractère ...

Alors appelez onFocusChange(View v, boolean hasFocus) ou ajoutez un bouton et un écouteur de clic.

1
Nuno Gonçalves