2010-01-05 17 views
131

Sto avendo uno EditText dove sto impostando la seguente proprietà in modo che possa visualizzare il pulsante done sulla tastiera quando l'utente fa clic su EditText.Come gestisco il clic del pulsante fatto su ImeOptions?

editText.setImeOptions(EditorInfo.IME_ACTION_DONE); 

Quando l'utente fa clic sul pulsante fatto sulla tastiera a schermo (battitura finito) voglio cambiare uno stato RadioButton.

Come posso tenere traccia del pulsante eseguito quando viene colpito dalla tastiera a schermo?

enter image description here

+1

può essere OnKeyboardActionListener aiutarmi qualsiasi esempio di codice ?? –

risposta

13

Maggiori dettagli su come impostare l'OnKeyListener, e farlo ascoltare il pulsante Fine.

Per prima cosa aggiungi OnKeyListener alla sezione implementa della tua classe. Quindi aggiungere la funzione definita nell'interfaccia 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; 
} 

Dato un oggetto EditText:

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

Questo non funziona più sulle applicazioni che utilizzano il livello API 17+, perché OnKeyListener non viene più attivato per gli eventi chiave: http://developer.android.com/reference/android/text/method/KeyListener.html – jjb

+0

Suggeriscono un'alternativa ora? –

+1

Sono passato a usare setOnEditorActionListener per cercare EditorInfo.IME_ACTION_DONE, che sembra funzionare bene. – jjb

73

Prova questa, dovrebbe funzionare per quello che ti serve:


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

Questo non funziona per HTC Evo. Per quanto ho potuto capire, HTC ha implementato la propria tastiera virtuale che ignora le imeOptions. – Dan

+0

Questo è sufficiente (non è necessario guardare l'azione dell'evento o il codice chiave, come nella risposta accettata); funziona sui miei dispositivi di test Nexus e Samsung. – Jonik

166

Ho finito con una combinazione di risposte Roberts e 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; 
    } 
}); 

Aggiornamento: Il codice di cui sopra sarebbero alcune volte attivare la richiamata due volte. Invece ho optato per il seguente codice, che ho ricevuto dai client di chat di 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

Ho appena cercato IME_ACTION_DONE e sono rimasto sorpreso dal fatto che non si sia attivato. Dopo ho anche cercato ACTION_DOWN e KEYCODE_ENTER che è stato finalmente attivato su EditorAction(). Poiché non vedo alcuna differenza nella tastiera integrata (mi aspettavo che il tasto Invio fosse evidenziato) mi chiedo quale sia il motivo dell'uso di android: imeOptions = "actionSend" per il layout XML di EditText. –

+0

Il secondo metodo funziona molto! Grazie –

+0

perché questa risposta non è accettata. questo fallisce in alcuni casi ?? –

21

So che questa domanda è vecchio, ma voglio sottolineare che cosa ha funzionato per me.

Ho provato a utilizzare il codice di esempio da Android Developers website (mostrato di seguito), ma non ha funzionato. Quindi ho controllato la classe EditorInfo e mi sono reso conto che il valore intero IME_ACTION_SEND è stato specificato come 0x00000004.

codice di esempio da Sviluppatori Android:

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; 
      } 
     }); 

Così, ho aggiunto il valore intero al mio file res/values/integers.xml.

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

Poi, ho modificato il mio file di layout res/layouts/activity_home.xml come segue

<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"/> 

E poi, il codice di esempio ha funzionato.

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

poi, il codice Java è,

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

Si dovrebbe restituire true nella clausola if per dire che l'hai gestita –

12

Mentre la maggior parte delle persone hanno risposto direttamente alla domanda, ho voluto approfondire di più sul concetto dietro di esso.Innanzitutto, sono stato attirato l'attenzione di IME quando ho creato un'attività di accesso predefinita. Ha generato un codice per me che includeva quanto segue:

<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"/> 

Si dovrebbe già avere familiarità con l'attributo inputType. Questo informa semplicemente Android del tipo di testo previsto come indirizzo email, password o numero di telefono. L'elenco completo dei valori possibili può essere trovato here.

Era, tuttavia, l'attributo imeOptions="actionUnspecified" che non ho capito il suo scopo. Android ti consente di interagire con la tastiera che si apre dalla parte inferiore dello schermo quando il testo viene selezionato utilizzando InputMethodManager. Nell'angolo in basso della tastiera, c'è un pulsante, in genere dice "Avanti" o "Fatto", a seconda del campo di testo corrente. Android ti consente di personalizzarlo utilizzando android:imeOptions. È possibile specificare un pulsante "Invia" o "Avanti". L'elenco completo può essere trovato here.

Con questo, è possibile ascoltare le pressioni sul pulsante di azione definendo un TextView.OnEditorActionListener per l'elemento EditText. Come nel tuo esempio:

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; 
    } 
}); 

Ora nel mio esempio ho avuto attributo android:imeOptions="actionUnspecified". Ciò è utile quando si desidera provare ad accedere a un utente quando preme il tasto Invio. Nella vostra attività, è possibile rilevare questo tag e quindi tentare il login:

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

Grazie! Ha funzionato perfettamente! –

Problemi correlati