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.
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.
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.
Toute personne utilisant ButterKnife. Vous pouvez utiliser comme:
@OnTextChanged(R.id.Zip_code)
void onZipCodeTextChanged(CharSequence zipCode, int start, int count, int after) {
}
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());
}
});
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);
}
});
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.
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.