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.
3 Réponses :
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)
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
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.
Veuillez parcourir la bibliothèque de liaison de données Android et LiveData. Vous n'avez pas besoin d'écrire ces codes passe-partout.
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(); } }); }