2010-01-05 4 views
131

J'ai un EditText où je règle la propriété suivante de sorte que je puisse afficher le bouton fait sur le clavier quand l'utilisateur clique sur l'EditText.Comment gérer le clic sur le bouton ImeOptions?

editText.setImeOptions(EditorInfo.IME_ACTION_DONE); 

Lorsque l'utilisateur clique sur le bouton fait sur le clavier de l'écran (fini de taper) Je veux changer un état RadioButton.

Comment puis-je effectuer le suivi du bouton Terminé lorsque vous appuyez sur le clavier à l'écran?

enter image description here

+1

peut être OnKeyboardActionListener m'aider un exemple de code ?? –

Répondre

13

Plus de détails sur la façon de régler le OnKeyListener, et l'ont écouter le bouton Terminé.

Commencez par ajouter OnKeyListener à la section implements de votre classe. Ensuite, ajoutez la fonction définie dans l'interface OnKeyListener:

/* 
* Respond to soft keyboard events, look for the DONE press on the password field. 
*/ 
public boolean onKey(View v, int keyCode, KeyEvent event) 
{ 
    if ((event.getAction() == KeyEvent.ACTION_DOWN) && 
     (keyCode == KeyEvent.KEYCODE_ENTER)) 
    { 
     // Done pressed! Do something here. 
    } 
    // Returning false allows other listeners to react to the press. 
    return false; 
} 

Étant donné un objet EditText:

EditText textField = (EditText)findViewById(R.id.MyEditText); 
textField.setOnKeyListener(this); 
+1

Cela ne fonctionne plus sur les applications qui ciblent le niveau 17+ de l'API, car votre OnKeyListener n'est plus activé pour les événements de touches programmables: http://developer.android.com/reference/android/text/method/KeyListener.html – jjb

+0

Suggèrent-ils une alternative maintenant? –

+1

Je suis passé à l'aide de setOnEditorActionListener pour rechercher EditorInfo.IME_ACTION_DONE, qui semble fonctionner correctement. – jjb

73

Essayez cela, il devrait fonctionner pour ce dont vous avez besoin:


editText.setOnEditorActionListener(new EditText.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(EditText v, int actionId, KeyEvent event) { 
    if (actionId == EditorInfo.IME_ACTION_DONE) { 
     //do here your stuff f 
     return true; 
    } 
    return false; 
    } 
}); 
+9

Cela ne fonctionne pas pour HTC Evo. Pour autant que j'ai pu comprendre, HTC a implémenté son propre clavier logiciel qui ignore les imeOptions. – Dan

+0

Cela suffit (pas besoin de regarder l'action de l'événement ou le code de la clé, comme dans la réponse acceptée); fonctionne sur mes appareils de test Nexus et Samsung. – Jonik

166

Je me suis retrouvé avec une combinaison de réponses Roberts et Chirags:

((EditText)findViewById(R.id.search_field)).setOnEditorActionListener(
     new EditText.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
     // Identifier of the action. This will be either the identifier you supplied, 
     // or EditorInfo.IME_NULL if being called due to the enter key being pressed. 
     if (actionId == EditorInfo.IME_ACTION_SEARCH 
       || actionId == EditorInfo.IME_ACTION_DONE 
       || event.getAction() == KeyEvent.ACTION_DOWN 
       && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) { 
      onSearchAction(v); 
      return true; 
     } 
     // Return true if you have consumed the action, else false. 
     return false; 
    } 
}); 

Mise à jour: Le code ci-dessus serait quelques fois activer le rappel deux fois. Au lieu de cela, j'ai opté pour le code suivant, que je suis arrivé des clients de messagerie instantanée Google:

public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
    // If triggered by an enter key, this is the event; otherwise, this is null. 
    if (event != null) { 
     // if shift key is down, then we want to insert the '\n' char in the TextView; 
     // otherwise, the default action is to send the message. 
     if (!event.isShiftPressed()) { 
      if (isPreparedForSending()) { 
       confirmSendMessageIfNeeded(); 
      } 
      return true; 
     } 
     return false; 
    } 

    if (isPreparedForSending()) { 
     confirmSendMessageIfNeeded(); 
    } 
    return true; 
} 
+4

Je viens de chercher IME_ACTION_DONE et j'ai été surpris qu'il ne se déclenche pas. Après avoir également recherché ACTION_DOWN et KEYCODE_ENTER, il a finalement déclenché onEditorAction(). Comme je ne vois aucune différence dans le clavier intégré (je m'attendais à ce que la touche Entrée soit mise en surbrillance), je me demande quel est le but de l'utilisation d'android: imeOptions = "actionSend" pour la mise en page XML EditText. –

+0

La deuxième méthode est de travailler grandement! Merci –

+0

pourquoi cette réponse n'est pas acceptée. Est-ce que cela échoue dans quelques cas? –

21

Je sais que cette question est vieux, mais je tiens à souligner ce qui a fonctionné pour moi.

J'ai essayé d'utiliser l'exemple de code du Android Developers website (illustré ci-dessous), mais cela n'a pas fonctionné. J'ai donc vérifié la classe EditorInfo, et j'ai réalisé que la valeur entière IME_ACTION_SEND était spécifiée comme 0x00000004.

exemple de code d'Android développeurs:

editTextEmail = (EditText) findViewById(R.id.editTextEmail); 
editTextEmail 
     .setOnEditorActionListener(new OnEditorActionListener() { 
      @Override 
      public boolean onEditorAction(TextView v, int actionId, 
        KeyEvent event) { 
       boolean handled = false; 
       if (actionId == EditorInfo.IME_ACTION_SEND) { 
        /* handle action here */ 
        handled = true; 
       } 
       return handled; 
      } 
     }); 

Donc, j'ai ajouté la valeur entière à mon dossier res/values/integers.xml.

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <integer name="send">0x00000004</integer> 
</resources> 

Puis, j'édité mon fichier de mise en page res/layouts/activity_home.xml comme suit

<EditText android:id="@+id/editTextEmail" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:imeActionId="@integer/send" 
    android:imeActionLabel="@+string/send_label" 
    android:imeOptions="actionSend" 
    android:inputType="textEmailAddress"/> 

Et puis, le code de l'échantillon a travaillé.

13
<EditText android:imeOptions="actionDone" 
    android:inputType="text"/> 

alors, le code java est

edittext.setOnEditorActionListener(new OnEditorActionListener() { 

    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 

    if ((actionId == EditorInfo.IME_ACTION_DONE)) { 

     Log.i(TAG,"Here you can write the code"); 
     }  
     return false; 
    } 
    }); 
+0

Vous devriez retourner vrai dans la clause if pour dire que vous l'avez manipulé –

12

Alors que la plupart des gens ont répondu à la question directement, je voulais en dire davantage sur le concept derrière elle.Tout d'abord, j'ai été attiré par l'attention d'IME lorsque j'ai créé une activité de connexion par défaut. Il a généré du code pour moi qui comprenait ce qui suit:

<EditText 
    android:id="@+id/password" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:hint="@string/prompt_password" 
    android:imeActionId="@+id/login" 
    android:imeActionLabel="@string/action_sign_in_short" 
    android:imeOptions="actionUnspecified" 
    android:inputType="textPassword" 
    android:maxLines="1" 
    android:singleLine="true"/> 

Vous devriez déjà être familier avec l'attribut inputType. Cela informe simplement Android du type de texte attendu, comme une adresse e-mail, un mot de passe ou un numéro de téléphone. La liste complète des valeurs possibles peut être trouvée here.

Il était, cependant, l'attribut imeOptions="actionUnspecified" que je n'ai pas compris son but. Android vous permet d'interagir avec le clavier qui apparaît à partir du bas de l'écran lorsque le texte est sélectionné en utilisant le InputMethodManager. Dans le coin inférieur du clavier, il y a un bouton, généralement il dit "Suivant" ou "Terminé", selon le champ de texte actuel. Android vous permet de personnaliser cela en utilisant android:imeOptions. Vous pouvez spécifier un bouton "Envoyer" ou un bouton "Suivant". La liste complète peut être trouvée here. Par la suite, vous pouvez écouter les pressions sur le bouton d'action en définissant un TextView.OnEditorActionListener pour l'élément EditText. Comme dans votre exemple:

editText.setOnEditorActionListener(new EditText.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(EditText v, int actionId, KeyEvent event) { 
    if (actionId == EditorInfo.IME_ACTION_DONE) { 
     //do here your stuff f 
     return true; 
    } 
    return false; 
    } 
}); 

Maintenant, dans mon exemple, j'avais android:imeOptions="actionUnspecified" attribut. Ceci est utile lorsque vous voulez essayer de vous connecter à un utilisateur quand il appuie sur la touche Entrée. Dans votre activité, vous pouvez détecter cette balise, puis tenter la connexion:

mPasswordView = (EditText) findViewById(R.id.password); 
    mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
     @Override 
     public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) { 
      if (id == R.id.login || id == EditorInfo.IME_NULL) { 
       attemptLogin(); 
       return true; 
      } 
      return false; 
     } 
    }); 
+0

Merci! Cela a fonctionné parfaitement! –

Questions connexes