2009-12-28 13 views
16

Sto utilizzando onKeyListener per ottenere gli eventi onKey. Funziona bene con la normale tastiera. Ma non funziona con la tastiera morbida. Sono in grado di ottenere solo eventi chiave per numeri e non alfabeti. C'è qualche soluzione per risolvere questo? Qualsiasi tipo di aiuto sarà molto apprezzato.onKeyListener non funziona con tastiera virtuale (Android)

+0

Sembra strano se stai ricevendo alcuni caratteri, ma non altri dalla tastiera virtuale. Puoi pubblicare il codice del tuo ascoltatore e dove lo stai allegando? –

+0

public void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.login_screen); emailTxt = (EditText) findViewById (R.id.email); emailTxt.setOnKeyListener (nuova OnKeyListener() { \t \t \t pubblico OnKey booleana (Visualizza v, int keyCode, evento KeyEvent) \t \t { \t \t \t Log.i ("Valore Chiave", String. valueOf (keyCode)); \t \t}); } –

+0

Sto solo leggendo le chiavi per ora. –

risposta

10

Non credo che un OnKeyListener venga chiamato affatto con la tastiera software. Ha qualcosa a che fare con la tastiera software che è un dispositivo IME e i dispositivi IME possono essere diversi dalle tastiere. Sembra però che onKeyListener sia praticamente inutile, dal momento che funziona solo su telefoni con tastiere hardware. Di recente ho risolto questo problema utilizzando TextWatcher nel campo EditText nella mia attività invece di utilizzare OnKeyListener.

+0

Ho provato a utilizzare TextWatcher ma ho bisogno degli eventi KeyUp e KeyDown per ogni tasto premuto. Textwatcher mi dà solo l'evento keydown. –

+0

Non penso sia possibile ascoltare KeyUp e KeyDown dalla tastiera del software. –

7

onKeyListener ha funzionato perfettamente su Android 1.5 tramite la tastiera software

da Android 1.6 in poi i tasti dei caratteri e il numero non stanno andando via l'evento OnKey, eppure il tasto CANC fa

Frustrante

3

Questo sembra essere specifico del dispositivo. Posso confermare che funziona su Xoom e Acer A100. Tuttavia, il Samsung Galaxy Tab Plus attiva l'evento solo per i pulsanti senza carattere. (Tutti i dispositivi che funzionano a nido d'ape)

1

Ho aggirato questo mettendo il listener nel suo metodo e richiamandolo di nuovo dopo la prima volta. Nel onCreate chiamo setKeyListenerForEnter();

Poi, ecco il metodo:

pubblico setKeyListenerForEnter void() {

final EditText search_entry = (EditText) findViewById(R.id.search_entry); 
    search_entry.setOnKeyListener(new OnKeyListener() { 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      // If the event is a key-down event on the "enter" button 
      if ((event.getAction() == KeyEvent.ACTION_DOWN) && 
       (keyCode == KeyEvent.KEYCODE_ENTER)) { 
       getSearchResults(v); 
       setKeyListenerForEnter(); 
       return true; 
      } 
      return false; 
     } 
    }); 
} 

Non sono sicuro se questa è una soluzione migliore rispetto manipolazione della tastiera IME in sé, ma è una soluzione .

4

Questo è probabilmente stupido, ma è così che funziona Android al momento.

La documentazione afferma che gli eventi chiave verranno propagati solo per i tratti chiave hardware, non software.

I produttori di dispositivi vengono effettivamente scoraggiati per propagare gli eventi di tasti software tramite gli ascoltatori di chiavi, anche se è completamente a discrezione del produttore onorare o trattare effettivamente le tastiere morbide e rigide a parità di condizioni.

A partire da Android 4.2.2, il sistema Android stesso non supporta affatto gli eventi di attivazione delle chiavi per le tastiere software, quindi anche i produttori non saranno in grado di scegliere la propria strada.

Quindi l'unica opzione infallibile qui è quella di implementare il proprio IME (tastiera virtuale) e gestire da soli i tasti.

TextWatcher può essere utilizzato principalmente per sostituire gli ascoltatori di chiavi, comunque editText.setText (...); attiverà anche gli eventi TextWatcher, quindi se uno è interessato a digitare solo le chiavi allora probabilmente TextWatcher non è una soluzione.

Si prega di prestare attenzione quando si utilizza TextWatcher con AutocomleteTextView o EditText. Non modificare il testo nel contenuto di AutocompleteTextView/EditText dagli eventi di TextWatcher, perché altrimenti probabilmente finirai in un ciclo di eventi/ascolto infinito.

Spero che questo aiuti a chiarire le opzioni disponibili, ma purtroppo non fornisce una soluzione di lavoro.

Deludente per il fatto che Google abbia perso questo importante aspetto dell'interfaccia utente.

-1
setFocusableInTouchMode(true); //Enable soft keyboard on touch for target view 

setFocusable(true); //Enable hard keyboard to target view 

esempio:

public class CanvasView extends View{ 
    public CanvasView(Context c){ 
     super(c); 

     //enable keyboard 
     setOnKeyListener(new KeyBoard()); 
     setFocusable(true); 
     setFocusableInTouchMode(true); 
    } 
} 
+0

Puoi per favore darci un esempio di come si può usare questo codice? L'ho provato ora e non sembra funzionare. – Simon

+0

public class CanvasView estende View { \t \t CanvasView pubblico (Context c) { \t \t super (c); \t \t \t \t // abilitare tastiera \t \t setOnKeyListener (nuova tastiera()); \t \t setFocusable (true); \t \t setFocusableInTouchMode (true); \t}} // abilita la tastiera su canvasView – user3309567