安卓Webview捕获链接点击

23
我正在开发的应用程序具有一个Webview,我需要捕获Webview请求的点击事件(例如:单击链接、单击按钮、单击YouTube视频播放按钮等)
4个回答

27

这可以完成。

您需要为您的WebView设置一个WebViewClient,以下是如何实现。

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

2
这在我的情况下无法捕捉事件。XML 部分有什么要求吗? - Virthuss
2
@Virthus,Android的WebView非常有问题,几乎没什么用。有时代码一开始能运行,但一分钟后就不能了。我不知道它想要什么。https://wiki.mozilla.org/Mobile/GeckoView - exploitr
为避免多次调用,应该使用onPageFinished而不是onLoadResource,对吗? - Lucas B.

6

使用这段代码,它对我有效

webview.setWebViewClient(new WebViewClient()
        {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url)
            {
                return true;
            }
        });

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

2
当您在应用程序中处理链接时,WebViewClient回调(例如shouldOverrideUrlLoading和doUpdateVisitedHistory)可能无法呈现一致或正确的值。在这种情况下,@android.webkit.JavascriptInterface是您的朋友。思路是编写JavaScript点击处理程序(在内容中),通过JavascriptInterface方法将信息传递给您的应用程序。
以下是一个捕获内部跳转到#锚点源处的scrollY的JavaScript示例。一旦在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报告页面已完全加载(例如,在进行复杂格式设置时非常有用,当行移动完成之前不想设置setScrollY)。

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

    window.onload = function () {
       AndroidCode.setLoadedStatus(true);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接