2012-06-28 21 views
7

Ecco il mio codice:Ascoltate tasto ENTER in Android

public class CaptureENTER extends Activity implements OnKeyListener{ 

/* on create and other stuff in here*/ 

    @Override 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     if ((event.getAction() == KeyEvent.ACTION_DOWN) && 
       (keyCode == KeyEvent.KEYCODE_ENTER)) { 
      Toast.makeText(LiVoiceActivity.this, 
            "YOU CLICKED ENTER KEY", 
            Toast.LENGTH_LONG).show(); 

     }  
     return false; 
    } 

Non so cosa sta succedendo, ma quando si preme il tasto INVIO in mia tastiera (sto usando l'emulatore di Android), l'evento non è attivato.

Cosa mi manca?

risposta

10

Prova questa:

public class CaptureENTER extends Activity implements OnKeyListener{ 

/* on create and other stuff in here*/ 

    @Override 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     if ((event.getAction() == KeyEvent.ACTION_DOWN) && 
       (keyCode == KeyEvent.KEYCODE_ENTER)) { 
      Toast.makeText(LiVoiceActivity.this, 
            "YOU CLICKED ENTER KEY", 
            Toast.LENGTH_LONG).show(); 
      return true; 

     }   
     return false; 
    } 

EDIT: David è corretto !!

Il ritorno vero non è il problema.

Si sta fallendo perché è necessario impostare l'ascoltatore su una vista, non solo sull'attività.

16

Restituire true non è il problema.

Si sta fallendo perché è necessario impostare l'ascoltatore su View, non solo su Activity.

modificati chiarimenti:

Il valore restituito l'ascoltatore non è destinato a essere inteso come un segnale che l'evento o non verrà chiamato. E non poteva comunque, dal momento che la clausola return viene chiamata solo dopo viene mostrato il tuo Toast.

È un segnale al sistema che è necessario eseguire ulteriori azioni (restituire false) o che il metodo gestisca l'evento completamente e correttamente (restituire true). Ecco perché il documentation dice con queste parole:

Returns

True se l'ascoltatore ha consumato l'evento, altrimenti false.


C'è una differenza tra:

  • Attuazione del View.OnKeyListenerinterface nella classe Activity.

che consente al Activity per implementare le funzionalità fornite dall'interfaccia nella tua classe, vale a dire, a dichiarare al mondo che il vostro Activity sa come gestire questo tipo di evento.

Si prega di prestare attenzione al fatto che ho detto "dichiarare".Solo perché hai dichiarato di sapere come gestire un'attività non significa che le persone ti daranno quell'attività, né che tu possa generare tali compiti da solo. Secondo me è una buona metafora per la parola chiave implements. Qui il Activity "chiede un compito".

Metafore a parte, tecnicamente, il Activity sta definendo un modo per gestire quell'evento, ma non può generare quel tipo di evento da solo.

  • impostando i View callback al vostro Activity implementazione

Utilizzando che, una View si lega ad un ascoltatore (che risulta essere il vostro Activity), promettendo di notifica ogni volta che l'evento si verifica.

Si "contrae" con il Activity per ricevere un input (l'utente preme il tasto INVIO mentre è attivo lo View) e notifica lo Activity. E poiché lo Activity ha dichiarato in precedenza che è in grado di eseguirlo, ENTRAMBI le parti possono eseguire il contratto come concordato in precedenza (vedere l'articolo precedente).

Fuor di metafora di nuovo, tecnicamente, qui il Activity viene registrata dal View per essere notificato più tardi, quando il grilletto View l'evento. Il Activity dichiara come, ma lo conosce quando.

Conclusione:

Questa è solo una metafora per interface s (almeno in questo caso). Può sembrare complicato, ma è chiarissimo quando si pensa a un accordo tra due parti. Se hai bisogno di una spiegazione migliore, tecnica, ti suggerisco di leggere lo interface s.


Risposta al commento domanda:

Ciao Davide e tutti gli altri. Davvero non posso impostare un ascoltatore per l'intera attività?

Non in questo modo. È necessario eseguire l'override di dispatchKeyEvent. Un esempio:

@Override 
public boolean dispatchKeyEvent(KeyEvent e) { 
if (e.getKeyCode() == KeyEvent.KEYCODE_ENTER) { 
    Toast.makeText(UITestsActivity.this, 
       "YOU CLICKED ENTER KEY", 
       Toast.LENGTH_LONG).show(); 
     return true; 
    } 
    return super.dispatchKeyEvent(e); 
}; 
+0

Ah, e ovviamente deve essere quello focalizzato ... altrimenti come dovremmo differenziare comunque le Visualizzazioni in modalità non-touch ... Sono sicuro che prestate attenzione a questo , destra? destra? ;-) – davidcesarino

+0

+1 per la risposta esatta –

+0

Ciao David e tutti gli altri. Davvero non posso impostare un ascoltatore per l'intera attività? –