Réagir à l'appui sur 'OK' dans le clavier virtuel

Les IMEOptions ne semblent pas fonctionner

L'auteur de ce sujet a trouvé une solution à son problème.
Staff
Auteur du sujet

Salut,

je suis actuellement en train de faire une application Android et je me trouve devant un problème.

Je dois taper un nombre qui sera mon budget. Je crée donc un EditText :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"

            android:inputType="numberDecimal"
            android:ems="10"
            android:id="@+id/editBudget"
            android:layout_row="0"
            android:layout_column="1"
            android:hint="42.42" />

Jusque là tout va bien. Lorsque je prends le focus de l'EditText, le clavier virtuel s'affiche, j'entre mon nombre et j'appuie sur "OK", et mon clavier s'en va. Oui mais voilà : ce nombre, je dois le dispatcher dans mon modèle lorsque l'appui sur OK est fait. Or, actuellement, il faut qu'un autre événement ait lieu pour que ça fonctionne, par exemple, l'appui sur ce bouton déclanche un listener qui lit la valeur du budget :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Générer ma liste de courses"
        android:id="@+id/validate_search"
        android:layout_row="3"
        android:paddingBottom="5px"
        android:layout_marginLeft="25px"
        android:layout_marginBottom="5px"
        android:layout_column="0" />

J'ai donc fait quelques recherches et suis arrivé à deux "solutions" proposées :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
final EditText budget = (EditText)view.findViewById(R.id.editBudget);
        budget.addTextChangedListener(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) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                try {
                    parentActivity.getShopList().setBudget(Float.valueOf(budget.getText().toString()));
                }catch (Exception e){
                    budget.setText("0");
                }
            }
        });

Celle-ci ne fonctionne pas car elle appelle la callback à chaque changement de nombre et modifie donc mon modèle même quand j'ajoute ou enlève un chiffre, ce qui est gênant puisqu'en cas de budget trop bas, mon modèle notifie un objet qui lance une popup d'avertissement (idem pour budget très élevé).

J'ai donc tenté le code qu'on trouve ici:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
((EditText)findViewById(R.id.youredittext)).setOnEditorActionListener(
    new EditText.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    if (actionId == EditorInfo.IME_ACTION_SEARCH ||
            actionId == EditorInfo.IME_ACTION_DONE ||
            event.getAction() == KeyEvent.ACTION_DOWN &&
            event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
        if (!event.isShiftPressed()) {
           // the user is done typing. 

           return true; // consume.
        }                
    }
    return false; // pass on to other listeners. 
}
});

Mais il semblerait que la galaxy tab qui me serve de device de test ne prenne pas en compte l'option actionId == EditorInfo.IME_ACTION_DONE.

Sauriez-vous comment gérer ça?

+0 -0

Cette réponse a aidé l'auteur du sujet

Salut,

Je pense que quelque chose de plus simplifié devrait fonctionner :

1
2
3
4
5
6
7
8
edittext.setOnKeyListener(new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
       if (event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER) {
          // Touche OK sélectionné.
          return true;
     }
   return false;
});

Ceci étant dit, sache que Samsung sera ton pire ennemie dans le développement Android. Oui, oui, c'est eux qui ont le monopole du marché pour l'instant …

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte