133 votes

Comment utiliser un seul TextWatcher pour plusieurs EditTexts ?

J'ai 3 EditText box dans mon activité, comment obtenir un texte modifié en utilisant un seul Textwatcher.

199voto

Sky Kelsey Points 3405

Je viens de rencontrer ce problème. Je l'ai résolu en créant une implémentation de classe interne de TextWatcher qui prend une vue comme argument. Ensuite, dans l'implémentation de la méthode, il suffit d'activer la vue pour voir de quelle vue provient l'Editable :

//Declaration
private class GenericTextWatcher implements TextWatcher{

    private View view;
    private GenericTextWatcher(View view) {
        this.view = view;
    }

    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

    public void afterTextChanged(Editable editable) {
        String text = editable.toString();
        switch(view.getId()){
            case R.id.name:
                model.setName(text);
                break;
            case R.id.email:
                model.setEmail(text);
                break;
            case R.id.phone:
                model.setPhone(text);
                break;
        }
    }
}

// Usage:

name = (EditText) findViewById(R.id.name);
name.setText(model.getName());
name.addTextChangedListener(new GenericTextWatcher(name));

email = (EditText) findViewById(R.id.email);
email.setText(model.getEmail());
email.addTextChangedListener(new GenericTextWatcher(email));

phone = (EditText) findViewById(R.id.phone);
phone.setText(model.getPhone());
phone.addTextChangedListener(new GenericTextWatcher(phone));

49voto

Tomasz Points 128

Si vous voulez utiliser uniquement afterTextChanged comparez les modifiables :

@Override
public void afterTextChanged(Editable editable) {
    if (editable == mEditText1.getEditableText()) {
        // DO STH
    } else if (editable == mEditText2.getEditableText()) {
        // DO STH
    }
}

13voto

Asha Babu Points 159

Il fonctionnera avec ce code

TextWatcher watcher = new TextWatcher() {
  @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            //YOUR CODE
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            //YOUR CODE
        }

        @Override
        public void afterTextChanged(Editable s) {
          String outputedText = s.toString();

  mOutputText.setText(outputedText);

        }
    };

Puis ajoutez ceci dans oncreate

  mInputText.addTextChangedListener(watcher);
        e2.addTextChangedListener(watcher);
        e3.addTextChangedListener(watcher);
        e4.addTextChangedListener(watcher);

6voto

NitroxDM Points 1176

Faites en sorte que votre classe hérite de Activity et implémente TextWatcher.

Ensuite, grâce à la magie du polymorphisme, il suffit de s'abonner aux événements.

Cela ne vous dira pas ce que TextEdit a changé, cependant en utilisant une combinaison de ceci et de Sky Kelsey La réponse de l'auteur vous permettra de résoudre ce problème.

    public YourActivity extends Activity implements TextWatcher {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_YourActivity);

            //Subscribe to the events
            EditText txt1 = (EditText) findViewById(R.id.txt1);
            txt1.addTextChangedListener(this);

            EditText txt2 = (EditText) findViewById(R.id.txt2);
            txt2.addTextChangedListener(this);
        }

            @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

                EditText txt1 = (EditText) findViewById(R.id.txt1);
                EditText txt2 = (EditText) findViewById(R.id.txt2);
                // You probably only want the text value from the EditText. But you get the idea. 
                    doStuff(txt1,txt2);
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.calc, menu);
            return true;
        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            // TODO Auto-generated method stub
        }
    }

3voto

Cristian Points 92147
TextWatcher watcher = new TextWatcher(){

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    }

    @Override
    public void afterTextChanged(Editable editable) {
    }
};

Ensuite :

editText1.addTextChangedListener(watcher);
editText2.addTextChangedListener(watcher);
editText3.addTextChangedListener(watcher);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X