21

我正在开发的应用程序有一个 webview,我需要捕获 webview 请求点击事件(例如:点击一个链接,点击一个按钮,点击一个 youtube 视频播放按钮,例如......)

4

4 回答 4

26

这可以做到

你必须为WebViewClient你的 WebView 设置一个。这是如何做到的。

WebView webView;//make sure to initialize  
webView.setWebViewClient(webViewClient);

WebViewClient webViewClient= new WebViewClient(){
    @Override
    public boolean shouldOverrideUrlLoading(WebView  view, String  url){
        return true;
    }
    @Override
    public void onLoadResource(WebView  view, String  url){
        if( url.equals("http://yoururl.com") ){
            // do something
        }
    }
}
于 2013-01-03T10:56:15.367 回答
6

使用此代码对我有用

webview.setWebViewClient(new WebViewClient()
        {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url)
            {
                return true;
            }
        });
于 2013-01-03T10:55:29.987 回答
3

你可以这样做:

WebView myWebView  = (WebView) findViewById(R.id.yourWebView);
myWebView.setWebViewClient(new MyWebViewClient());
myWebView.loadUrl("yourLink");

但不要忘记创建一个 WebViewClient:

public class MyWebViewClient extends WebViewClient {

     @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {

            return true;
        }
}
于 2013-01-03T11:00:38.103 回答
2

当您在应用程序中处理链接时,诸如 shouldOverrideUrlLoading 和 doUpdateVisitedHistory 之类的 WebViewClient 回调可能不会提供一致或正确的值。在这种情况下,@android.webkit.JavascriptInterface 是您的朋友。这个想法是编写 javascript 点击处理程序(在内容中),通过 JavascriptInterface 方法将信息传递给您的应用程序。

这是一个 javascript 示例,用于在内部跳转到 #-anchor 的源处捕获 scrollY。一旦进入 doUpdateVisitedHistory,获得此信息通常为时已晚。

if (typeof AndroidCode != "undefined") { 
  var coll = document.getElementsByTagName("a"); 
  for (let i = 0; i < coll.length; i++) { 
    var href = coll[i].getAttribute("href"); 
    if (href.indexOf("#") >= 0) { 
      coll[i].addEventListener("click", function() { 
        AndroidCode.reportInternalJump(); 
      }); 
    } 
  } 
}

AndroidCode 是通过 WebView.addJavascriptInterface 声明的对象的名称。

这是此技术的另一个有用示例,尽管它与链接没有直接关系。它将向 OnPageFinished 报告页面已完全加载(例如,在进行复杂格式化并且您不想在行完成移动之前设置滚动Y 时很有用)。

if (typeof AndroidCode != "undefined") {
    AndroidCode.setLoadedStatus(false);

    window.onload = function () {
       AndroidCode.setLoadedStatus(true);
    }
}
于 2020-11-23T19:13:38.637 回答