2014-10-13 2 views
4

Возможно ли обрабатывать события с клавиатурой программного обеспечения из веб-представления в приложении для Android-хоста?Listen Webview Key Events с программной клавиатуры в Android Activity

Например, может ли моя активность приложения прослушивать введенный текст в поле поиска веб-сайта, отображающего веб-сайт Google?

Учитывая описанный ниже способ, это было бы возможно, если бы я перезаписал его, возвращая true, но, к сожалению, я не смог этого сделать. Есть идеи?

public boolean shouldOverrideKeyEvent (WebView view, KeyEvent event) 

Added in API level 1 
Give the host application a chance to handle the key event synchronously. e.g. menu shortcut key  events need to be filtered this way. If return true, WebView will not handle the key event. If return false, WebView will always handle the key event, so none of the super in the view chain will see the key event. The default behavior returns false. 

Parameters 
view The WebView that is initiating the callback. 
event The key event. 
Returns 
True if the host application wants to handle the key event itself, otherwise return false 
+0

вы хотите сделать это только для Google или всего сайта – Lokesh

+0

@joaonlima: Я боюсь, что если это WUD возможно, как если бы это WUD быть в случае человек может быть в состоянии отслеживать 3-D безопасные пароли, введенные (когда-если) на странице оплаты веб-просмотра (это, например, указывает, например, строка) – MOSO

ответ

1

Я думаю, что метод shouldOverrideKeyEvent просто говорит системе, которая «окно» должно получать уведомление ключевых событий; это делает NOT передает события WebView javascript обратно в Activity.

Если вам необходимо передать информацию из WebView в свою деятельность, вы можете использовать JavascriptInterface. Обратите внимание, что это возможно только на веб-сайте, которым вы управляете; в противном случае это будет лазейка безопасности, предоставляющая вашему приложению доступ к конфиденциальным данным.

Во-первых, создать класс, чтобы действовать в качестве интерфейса:

class MyJavaScriptInterface{ 
    //Methods to call via js in the WebView go here 
} 

Затем инициализировать интерфейс на вашем WebView:

mWebView.getSettings().setJavaScriptEnabled(true); 
mWebView.addJavascriptInterface(new MyJavaScriptInterface(), "JSInterface"); 

Теперь, вы сказали, что вы хотели передать содержание набранное из текстовое поле обратно в Activity. Для этого зарегистрируйте прослушиватель событий для текстового поля при размытии, который будет срабатывать, когда поле теряет фокус.

<!-- HTML element to listen for blur --> 
<input id="field" type="text" /> 

<script> 
    //Communicate with Javascript Interface 
    var jsFieldBlur = function(field){ 
     //Only call if the interface exists 
     if(window.JSInterface){ 
      window.JSInterface.onFieldBlur(field.id, field.value); 
     } 
    }; 

    //Obtain reference to DOM element 
    var field = document.getElementById("field"); 

    //Attach blur listener 
    field.addEventListener("blur", function(event) { 
     jsFieldBlur(event.target); 
    }, true); 
</script> 

Наконец, нам нужно добавить метод onFieldBlur к классу MyJavascriptInterface так его можно назвать с помощью JavaScript. Любые методы, определенные таким образом, должны предшествовать @JavascriptInterface, чтобы быть видимыми для WebView.

class MyJavaScriptInterface{ 
    @JavascriptInterface 
    public void onFieldBlur(String fieldId, String fieldValue){ 
     //Do something with value 
     Toast.makeText(getContext(), fieldId+"="+fieldValue, Toast.LENGTH_LONG).show(); 
    } 
} 
0
public class WebViewDemo extends Activity { 

WebView myWebView; 
@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    myWebView = (WebView) findViewById(R.id.webview); 
    myWebView.loadUrl("file:///android_asset/test.html"); 
    WebSettings webSettings = myWebView.getSettings(); 
    webSettings.setJavaScriptEnabled(true); 

    myWebView.addJavascriptInterface(new JavaScriptInterface(this), "Android"); 

    // myWebView.setWebViewClient(new WebViewClient()); 
    myWebView.setWebViewClient(new MyWebViewClient()); 
} 

public class JavaScriptInterface { 
    Context mContext; 

    /** Instantiate the interface and set the context */ 
    JavaScriptInterface(Context c) { 
     mContext = c; 
    } 

    /** Show a toast from the web page */ 
    public void showToast(String toast) { 
     Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); 
     startActivity(new Intent(WebViewDemo.this, WebViewDemo.class)); 
    } 
} 

private class MyWebViewClient extends WebViewClient { 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     if (Uri.parse(url).getHost().equals("www.google.com")) { 
      // This is my web site, so do not override; let my WebView load the page 
      Toast.makeText(getApplicationContext(), "www.google.com", Toast.LENGTH_SHORT).show(); 
      return false; 
     } 
     // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs 
     Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
     startActivity(intent); 
     return true; 
    } 
} 

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    // Check if the key event was the BACK key and if there's history 
    if ((keyCode == KeyEvent.KEYCODE_ENTER)) { 

     // here you can got key event of enter key (whether you used as for search of any other option 

     return true; 
    } 
    // If it wasn't the BACK key or there's no web page history, bubble up to the default 
    // system behavior (probably exit the activity) 
    return super.onKeyDown(keyCode, event); 
} 

}

Смежные вопросы