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?