2010-11-26 11 views
21

Non capisco perché questa parte di codice non funzioni. Vengono rilevati solo backspace e tasto di ritorno. L'ascoltatore non attiva nessun'altra chiave. Il mio dispositivo è Nexus One.onKeyListener non funziona su tastiera virtuale

Ho provato a sovrascrivere il metodo OnKeyDown dell'attività e questo è ancora peggio. L'unico pulsante rilevato era il pulsante indietro dell'hardware.

Sto vedendo in giro un suggerimento per utilizzare TextWatcher e onTextChanged, mentre potrebbe funzionare in alcuni casi, non è un vero problema. Ad esempio, se la casella di testo è vuota, non verrà rilevato se l'utente preme il pulsante BackSpace (Elimina). Quindi qualche idea?

 TextView txtInput = (TextView)findViewById(R.id.txtInput); 
    txtInput.setOnKeyListener(new View.OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      makeToast(keyCode + " key pressed"); 
      return true; 
     } 
    }); 
+0

Bene, ho trascorso 4 ore buone su questo problema. Sembra che nessuno abbia una soluzione per questo. Poche persone suggeriscono anche di usare OnKeyboardActionListener, ma non riescono a trovare alcun esempio su come usarlo. – bobetko

+0

Trovato l'esempio qui: http://developer.android.com/resources/samples/SoftKeyboard/src/com/example/android/softkeyboard/SoftKeyboard.html – bobetko

+0

Non sono sicuro che l'esempio di softkeyboard funzionerà per me. Non voglio scrivere un altro metodo di input. Voglio semplicemente mostrare il metodo di input predefinito sullo schermo (di solito la tastiera di Android) e catturare qualsiasi tasto premuto. Perché questo sembra un compito così scoraggiante? Mi sento frustrato – bobetko

risposta

18

Ok. Alla fine ho capito come fare ciò che voglio, e non sono orgoglioso di Android per questo.

Sto scrivendo un'applicazione server/client dove sul client devo aprire SoftKeyboard e inviare tasti premuti (caratteri e tasto CANC) ... Ogni volta che si preme il tasto, quel carattere viene inviato al server. Se viene premuto DEL, invio la sequenza {BS} al server.

Per fare ciò ho dovuto implementare TextWatcher e onTextChange che funziona bene tranne che per situazioni in cui EditText è vuoto e l'utente preme il tasto CANC. Poiché non c'è alcun cambiamento in EditText, non c'è modo di rilevare che il tasto CANC sia premuto.

Oltre a TextWatcher, ho dovuto implementare onKeyListener che ho allegato al mio controllo EditText. Questo onKeyListener ignora tutti i tasti su SoftKeyboard tranne DEL e RETURN. Non sai perché? Forse un bug?

Ecco il mio codice:

TextView txtInput = (TextView)findViewById(R.id.txtInput); 
    txtInput.addTextChangedListener(inputTextWatcher); 

    txtInput.setOnKeyListener(new View.OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      Log.d(TAG, keyCode + " character(code) to send"); 
      return false; 
     } 
    }); 

e TextWatcher ....

private TextWatcher inputTextWatcher = new TextWatcher() { 
    public void afterTextChanged(Editable s) { } 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) 
     { } 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     Log.d(TAG, s.charAt(count-1) + " character to send");;   
    } 
}; 
+0

È davvero irritante che alcune tastiere non sembrino inviare i codici chiave onkeyup (ad esempio, la tastiera predefinita Samsung su un S3/S4). Devi lavorare su di esso guardando per il testo cambiato invece ... – kenyee

+1

che dire quando non c'è nessun personaggio e l'utente premere il tasto indietro? – Arslan

4

Hai fatto un errore qui.
dovrebbe return true, Se si è gestito l'evento. Se si desidera consentire l'evento per essere gestito dalla prossima ricevente, return false
Sei sempre restituendo vero

+0

Grazie per aver chiarito questo. In realtà ho provato a restituire anche il falso. Leggendo intorno ho capito che devo usare onKeyboardActionListener. Passerà un po 'di tempo domani. Grazie. – bobetko

0

abbiamo avuto il problema TextWatcher su iPhone, come pure - se buffer è vuoto, la tastiera non invia del evento. Abbiamo lavorato attorno ad esso pre-caricando il buffer della tastiera con 1000 caratteri. Fortunatamente, la nostra app ha nascosto il campo di modifica dietro la tastiera in modo da non visualizzare i 1000 caratteri. È brutto, ma funziona (a meno che l'utente non prema 1000 eliminazioni in una riga prima di immettere qualsiasi dato!)

2

Hai provato a utilizzare la sottoclasse listener specifica per quella visualizzazione?

Ho avuto un problema simile con un EditText. Il seguente codice ha funzionato:

private OnKeyListener keyListener = new EditText.OnKeyListener(){ 

    @Override 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     EditText et = (EditText) v; 
     Log.i("APPEVENT", "Key hit: "+ event); 
     //... 
     return false; 
    } 

}; 

Ma se ho usato il View.OnKeyListener, ho solo backspace registrare e immettere. Potrebbe essere un problema simile con TextView. Forse gli ascoltatori della chiave della sottoclasse sono sensibili a più eventi per la sottoclasse data View.

3

Nota: menzione di inputtype nell'editoriale.

<EditText android:id="@+id/select_category" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:inputType="textCapSentences|textAutoCorrect" > 



edittext.setOnEditorActionListener(new OnEditorActionListener() { 

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

       if ((actionId & EditorInfo.IME_MASK_ACTION) == EditorInfo.IME_ACTION_DONE) { 
        //do something here. 
        return true; 
       } 
       return false; 
      } 
     }); 
+0

questo ha risolto il mio problema con la tastiera Mimuum. Funziona senza imeOptions come nel tuo codice? – Goufalite

Problemi correlati