9

Sto provando ad ascoltare gli eventi chiave nella visualizzazione web di Android. Esempio quando l'utente sta compilando un modulo, dovrei ricevere gli eventi chiave. Questo è il mio codice WebViewLeggi eventi della tastiera in Android WebView

public class MyWebView extends WebView implements OnKeyListener 
{ 
    ..... 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) 
    { 
     Log.i("PcWebView", "onKeyDown keyCode=" + keyCode); 
     return super.onKeyDown(keyCode, event); 
    } 

    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) 
    { 
     Log.i("PcWebView", "onKeyUp keyCode=" + keyCode); 
     return super.onKeyUp(keyCode, event); 
    } 

    @Override // Listener is initialized in the constructor 
    public boolean onKey(View v, int keyCode, KeyEvent event) 
    { 
     Log.i("PcWebView", "onKey keyCode=" + keyCode); 
     return false; 
    } 

    ..... 

} 

nessuno dei metodi onKeyDown, onKeyUp e onKey vengono chiamati quando tipi di utente nelle caselle di testo o textarea. È possibile raggiungere questo obiettivo o Android ha limitato questo b'cos di una possibile violazione della privacy?

+0

stati in grado di farlo funzionare? Ho esattamente lo stesso problema al momento ... –

+4

No, questo tipo di azione è considerato non sicuro in quanto le password possono essere registrate ecc. Quindi non è consentito in Android. –

risposta

9

Attenzione! Questa soluzione supporta solo lettere inglesi.

Realizzato senza alcun accesso al codice sorgente HTML o eventi JS. Funziona per me su Android 5.0.2 sia per tastiere software che hardware.

public class MyWebView extends WebView { 


    @Override 
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 
     return new BaseInputConnection(this, false); //this is needed for #dispatchKeyEvent() to be notified. 
    } 

    @Override 
    public boolean dispatchKeyEvent(KeyEvent event) { 
     boolean dispatchFirst = super.dispatchKeyEvent(event); 
     // Listening here for whatever key events you need 
     if (event.getAction() == KeyEvent.ACTION_UP) 
      switch (event.getKeyCode()) { 
       case KeyEvent.KEYCODE_SPACE: 
       case KeyEvent.KEYCODE_ENTER: 
        // e.g. get space and enter events here 
        break; 
      } 
     return dispatchFirst; 
    } 
} 

Il trucco è prevalente l'implementazione di ingresso fornita dal sistema di InputConnection con uno semplificata. Impedire agli sviluppatori di accedere agli eventi per impostazione predefinita è stato fatto apposta dai googler. Perché l'input dell'evento chiave non è l'unico. Ci sono gesti, voce e altro sta arrivando. Raccomandazione ufficiale è "smettere di fare affidamento su eventi chiave legacy per l'immissione di testo". Per ulteriori dettagli, vedere: https://code.google.com/p/android/issues/detail?id=42904#c15

+0

funziona quando lo stato attivo è su una casella di testo? –

+0

@PC. si certo. Per esempio. se la pagina caricata nella WebView è simile a https://www.google.com.ua, ricevi una notifica per ogni lettera inserita nella casella di testo. – riwnodennyk

+0

Ciò può causare problemi. Poiché si ignora 'EditorInfo' (che trasporta informazioni' InputType'), ciò può portare alla visualizzazione della tastiera errata. per esempio. l'ultima tastiera utilizzata è numerica, ma l'utente fa clic nel campo di testo, viene visualizzata la tastiera numerica (interessante è successo solo su alcuni dispositivi, ad esempio HTC One M8). Stavo cercando di nascondere la tastiera su Enter, dovevo realizzare questo in un modo diverso - Ho nascosto la tastiera quando l'URL sta per caricare ('webViewClient.shouldOverrideUrlLoading()'). – hmac

1

È possibile utilizzare la funzione onUnhandledKeyEvent() in override sulla classe WebViewClient. Funziona perfettamente per me.

onUnhandledKeyEvent

@Override 
public void onUnhandledKeyEvent(WebView view, KeyEvent event) { 
     return; 
} 

whenever a user presses any key on the keyboard, this event will get fire. 
Please let me know if that's works for you? 
Problemi correlati