1
votes

Comment désactiver le bouton avec plusieurs modifications de texte à l'aide de Textwatcher?

J'essaye de désactiver mon bouton si mes textes d'édition d'entrée sont vides. J'utilise Text Watcher pour cela. Pour le tester, je n'ai essayé qu'avec seulement deux textes d'édition pour commencer. Cependant, mon bouton reste activé quoi qu'il arrive.

private TextWatcher loginTextWatcher = new TextWatcher() {

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

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

        String firstNameInput =firstNameInput.getText().toString().trim();
        String lastNameInput = lastNameInput.getText().toString().trim();


        // tried doing it this way 
        nextBtn.setEnabled(!firstNameInput.isEmpty() && !lastNameInput.isEmpty());

        //What i've also tried 
        if(firstNameInput.length()> 0 &&
                lastNameInput.length()>0){
            nextBtn.setEnabled(true);
        } else{
            nextBtn.setEnabled(false);
        }
    }

    @Override
    public void afterTextChanged(Editable s) {

    }
};

Méthode de surveillance de texte

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

    fnameInput = findViewById(R.id.et_firstname);
    lnameInput = findViewById(R.id.et_lastname);
    numberInput = findViewById(R.id.et_phone);
    emailInput = findViewById(R.id.et_email);
    nextBtn = findViewById(R.id.btn_next);

    fnameInput.addTextChangedListener(loginTextWatcher);
    lnameInput.addTextChangedListener(loginTextWatcher);


    nextBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            launchNextActivity();
        }
    });
}

Je m'attends à ce que le bouton soit désactivé si une ou toutes les entrées sont vides et activée lorsque tous les champs d'entrée sont rempli.


0 commentaires

3 Réponses :


0
votes

créer une méthode vérifier toutes les conditions là-bas comme

private void checkTheConditions(){
  if(condition1 && condition2)
  nextBtn.setEnabled(true)
  else
  nextBtn.setEnabled(false)
}

appeler cette méthode à partir de la méthode afterTextChanged (modifiables)


2 commentaires

J'ai mis le button.setEnabled (false) sur, onCreate pour que mon bouton soit désactivé à la première vue et j'ai changé une logique. Mais à part cela, la condition fonctionnait lorsqu'elle était placée aprèsTextChanged.


ok, j'écris cette réponse en gardant à l'esprit certaines choses comme la validation du nom d'utilisateur et la vérification de la force du mot de passe. Si vous avez plus d'un textWatcher et que vous vérifiez différentes conditions différentes, cette réponse vous aidera



-1
votes

Oh! Vous avez fait une petite erreur. Utilisez la condition OR au lieu de AND . Donc, votre code doit être

nextBtn.setEnabled(!firstNameInput.isEmpty() || !lastNameInput.isEmpty());

Et TextWatcher ne notifiera que lorsque vous modifierez manuellement les entrées de EditText . Donc TextWatcher ne s'interrompra pas au démarrage. Donc, dans un premier temps, dans la méthode onCreate , vous devez vérifier manuellement ces EditText feilds.

Edit: La nouvelle bibliothèque DataBinding Android est la mieux adaptée à cet effet.


1 commentaires

Veuillez parcourir la bibliothèque de liaison de données Android et LiveData. Vous n'avez pas besoin d'écrire ces codes passe-partout.



0
votes

Considérons ce cas pour 2 EditTexts uniquement comme pour le moment. définir 2 CharSequence globales comme ci-dessous

void validate(){
        if (fName.length()>0 && lName.length()>0){
            nextBtn.setEnabled(true);

        }else {
            nextBtn.setEnabled(false);

        }
    }

alors vous devez définir un textwatcher différent pour chacun de vos Edittext

puis à l'intérieur de chacun de ces textWatcher attribuer des valeurs à CharSequence défini ci-dessus p>

private TextWatcher textWatcher2 = new TextWatcher() {

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

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

      lName=s;
      validate();  //method to enable or disable button (find method below)

    }

    @Override
    public void afterTextChanged(Editable s) {

    }
};

maintenant textWatcher2

private TextWatcher textWatcher = new TextWatcher() {

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

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

      fName=s;
      validate();  //method to enable or disable button (find method below)

    }

    @Override
    public void afterTextChanged(Editable s) {

    }
};

maintenant écrire la méthode de validation

CharSequence fName="";
CharSequence lName="";
Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_create_profile);

        fnameInput = findViewById(R.id.et_firstname);
        lnameInput = findViewById(R.id.et_lastname);
        numberInput = findViewById(R.id.et_phone);
        emailInput = findViewById(R.id.et_email);
        nextBtn = findViewById(R.id.btn_next);

        fnameInput.addTextChangedListener(textWatcher);
        lnameInput.addTextChangedListener(textWatcher2);


        nextBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                launchNextActivity();
            }
        });
    }


0 commentaires