9

Tôi đang cố gắng nghe các sự kiện chính trong chế độ xem web trên Android. Ví dụ khi người dùng điền vào biểu mẫu, tôi sẽ nhận được các sự kiện quan trọng. Đây là mã WebView tôiĐọc các sự kiện bàn phím trong 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; 
    } 

    ..... 

} 

không ai trong số các phương pháp onKeyDown, onKeyUponKey đang được gọi khi người dùng nhập vào textbox hoặc textareas. Có thể đạt được điều này hoặc Android đã hạn chế các b'cos này có thể vi phạm quyền riêng tư không?

+0

Were Bạn có thể làm cho nó làm việc? Tôi có chính xác cùng một vấn đề tại thời điểm này ... –

+4

Không, loại hành động này được coi là không an toàn vì mật khẩu vv có thể được ghi lại. Vì vậy, nó không được phép trong Android. –

Trả lời

9

Thận trọng! Giải pháp này chỉ hỗ trợ chữ cái tiếng Anh.

Hoàn tất mà không có quyền truy cập vào mã nguồn HTML hoặc sự kiện JS. Hoạt động với tôi trên Android 5.0.2 cho cả bàn phím mềm và phần cứng.

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

Bí quyết ở đây là ghi đè triển khai đầu vào do hệ thống cung cấp InputConnection bằng cách đơn giản hóa. Ngăn chặn các nhà phát triển truy cập vào các sự kiện theo mặc định được thực hiện bởi nhân viên của Google có mục đích. Bởi vì đầu vào sự kiện quan trọng không phải là duy nhất nữa. Có cử chỉ, giọng nói và nhiều thứ nữa đang đến. Đề xuất chính thức là "ngừng dựa vào các sự kiện chính cũ cho mục nhập văn bản ở tất cả". Hãy xem thêm chi tiết tại đây: https://code.google.com/p/android/issues/detail?id=42904#c15

+0

có hoạt động khi tiêu điểm nằm trên hộp văn bản không? –

+0

@PC. vâng, chắc chắn rồi. Ví dụ. nếu trang được tải vào WebView giống như https://www.google.com.ua, bạn sẽ được thông báo về mọi chữ cái đầu vào vào hộp văn bản. – riwnodennyk

+0

Điều này có thể gây ra sự cố. Bởi vì bạn bỏ qua 'EditorInfo' (mang thông tin' InputType') điều này có thể dẫn đến bàn phím sai được hiển thị. ví dụ. bàn phím được sử dụng cuối cùng là số nhưng người dùng nhấp vào trường văn bản, bàn phím số xuất hiện (thú vị điều này chỉ xảy ra trên một số thiết bị nhất định ví dụ: HTC One M8). Tôi đã cố gắng để ẩn bàn phím trên Enter, tôi đã phải đạt được điều này một cách khác nhau - Tôi giấu bàn phím khi URL là về để tải ('webViewClient.shouldOverrideUrlLoading()'). – hmac

1

Bạn có thể sử dụng chức năng onUnhandledKeyEvent() tràn ngập trên lớp WebViewClient. Hoạt động hoàn hảo cho tôi.

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? 
Các vấn đề liên quan