9

我想要聽取android web視圖中的關鍵事件。用戶填寫表單時的示例,我應該收到關鍵事件。這是我的WebView代碼閱讀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; 
    } 

    ..... 

} 

既不的方法onKeyDownonKeyUponKey被稱爲當用戶輸入到文本框或文本域。是否有可能實現這一目標,或者Android是否限制了可能的隱私違規行爲?

+0

是你能得到它的工作?我目前遇到同樣的問題...... – 2013-10-06 06:06:14

+4

不,這種行爲被認爲是不安全的,因爲密碼等可以被記錄下來。所以它不允許在android中。 – 2013-10-07 07:00:04

回答

9

注意!該解決方案僅支持英文字母。

在沒有任何訪問HTML源代碼或JS事件的情況下完成。適用於Android 5.0.2的軟硬件鍵盤。

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

這裏的技巧是覆蓋具有簡化一個InputConnection系統提供的輸入執行。默認情況下阻止開發者訪問事件是由Google員工進行的。因爲關鍵事件輸入不再是唯一的輸入。有手勢,聲音等等。官方建議「停止依靠傳統鍵盤事件進行文本輸入」。在此處查看更多詳細信息:https://code.google.com/p/android/issues/detail?id=42904#c15

+0

當焦點放在文本框上時它工作嗎? – 2015-04-15 15:38:21

+0

@PC。是的,當然。例如。如果加載到WebView的頁面類似於https://www.google.com.ua,則會在每個輸入到文本框中的字母上收到通知。 – riwnodennyk 2015-04-15 16:34:25

+0

這可能會導致問題。因爲你忽略了'EditorInfo'(它攜帶'InputType'信息),這可能導致顯示錯誤的鍵盤。例如。最後使用的鍵盤是數字,但用戶點擊文本字段,數字鍵盤出現(有趣的是,這隻發生在某些設備上,例如HTC One M8)。我試圖在Enter上隱藏鍵盤,我不得不以不同的方式實現這一點 - 當URL即將加載時('webViewClient.shouldOverrideUrlLoading()'),我隱藏了鍵盤。 – hmac 2017-09-06 13:53:13

1

您可以使用onUnhandledKeyEvent()函數覆蓋WebViewClient類。 適合我。

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?