Savoir quand l’édition du texte est terminée en cours d’édition

Comment savoir si mon texte de assembly est en cours de modification? Comme lorsque l’utilisateur sélectionne la case suivante ou appuie sur le bouton Terminé du clavier logiciel.

Je veux savoir cela pour pouvoir bloquer l’entrée. Il semble que afterTextChanged de l’observateur de texte se produise après la saisie de chaque caractère. Je dois faire des calculs avec l’entrée, donc je voudrais éviter de faire le calcul après chaque saisie de chaque caractère.

Merci

En utilisant quelque chose comme ça

meditText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { yourcalc(); return true; } return false; } }); 

EditText hérite de setOnFocusChangeListener qui implémente OnFocusChangeListener .

Implémentez onFocusChange et il y a un paramètre booléen pour hasFocus . Si c’est faux, vous avez perdu le focus sur un autre contrôle.

MODIFIER

Pour gérer les deux cas – éditer le texte en perdant le focus OU l’utilisateur clique sur le bouton “terminé” – créez une méthode unique appelée par les deux écouteurs.

  private void calculate() { ... } btnDone.setOnClickListener(new OnClickListener() { public void onClick(View v) { calculate(); } }); txtEdit.setOnFocusChangeListener(new OnFocusChangeListener() { public void onFocusChange(View v, boolean hasFocus) { if(!hasFocus) calculate(); } }); 

Utiliser un object EditText xml défini comme ceci:

   

Nous pouvons capturer son texte i) lorsque l’utilisateur clique sur le bouton Terminé sur le clavier logiciel (OnEditorActionListener) ou ii) lorsque EditText a perdu le focus utilisateur (OnFocusChangeListener) qui se trouve maintenant sur un autre EditText:

  /** * 3. Set the min value EditText listener */ editText= (EditText) this.viewGroup.findViewById(R.id.create_survey_newquestion_editText_minvalue); editText.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { Ssortingng input; if(actionId == EditorInfo.IME_ACTION_DONE) { input= v.getText().toSsortingng(); MyActivity.calculate(input); return true; // consume. } return false; // pass on to other listeners. } }); editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { Ssortingng input; EditText editText; if(!hasFocus) { editText= (EditText) v; input= editText.getText().toSsortingng(); MyActivity.calculate(input); } } }); 

Cela fonctionne pour moi. Vous pouvez masquer le clavier logiciel après avoir effectué les calculs en utilisant un code comme celui-ci:

 private void hideKeyboard(EditText editText) { InputMethodManager imm= (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); } 

Edit: ajout de valeurs à onEditorAction

J’ai fait cette chose simple, quand le focus est déplacé de l’édition du texte obtenir le texte. Cela fonctionnera si l’utilisateur déplace le focus pour sélectionner d’autres vues comme un bouton ou un autre EditText ou n’importe quelle vue.

  editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { EditText editText = (EditText) v; Ssortingng text = editText.getText().toSsortingng(); } } }); 

Pour être plus haut niveau, vous pouvez utiliser la méthode afterTextChanged () de TextWatcher .