9

私はアンドロイドウェブビューでキーイベントを待ち受けようとしています。例:ユーザーがフォームに記入するとき、私はキーイベントを受け取るべきです。これは私の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; 
    } 

    ..... 

} 

どちらの方法onKeyDownの、onKeyUponKeyユーザーがテキストボックスまたはテキストエリアに呼び出されているです。これを達成することは可能ですか、またはAndroidがこのプライバシーを侵害する可能性を制限しましたか?

+0

あなたはそれが働いて得ることができましたか?私は現時点でまったく同じ問題を抱えています... –

+4

いいえ、このタイプのアクションは、パスワードなどを記録できるので安全ではないと考えられます。したがって、アンドロイドでは許可されていません。 –

答えて

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

フォーカスがテキストボックスにある場合は機能しますか? @ –

+0

@PC。はい、確かです。例えば。 WebViewに読み込まれたページがhttps://www.google.com.uaのようなものである場合、テキストボックスに入力されたすべての文字が通知されます。 – riwnodennyk

+0

これは問題を引き起こす可能性があります。 'EditorInfo'(' InputType'情報を持ちます)を無視するので、間違ったキーボードが表示されることがあります。例えば。最後に使用されたキーボードは数字ですが、ユーザーがテキストフィールドにクリックすると、数値キーボードが表示されます(興味深いことに、これはHTC One M8などの特定のデバイスでのみ発生しています)。私はEnterキーでキーボードを隠そうとしていましたが、これを別の方法で実現しなければなりませんでした.URLが読み込まれるとキーボードが隠されました( 'webViewClient.shouldOverrideUrlLoading()')。 – hmac

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? 
関連する問題