Android检测webview URL更改

Dan*_*iel 19 url android webview

我的Android应用程序中有一个webview,想要检测网址何时发生变化.

当用户在info.php页面上时,我想使用它来隐藏顶部栏中的信息按钮,当他不在info.php页面上时再次显示它.

我用Google搜索但找不到任何正常工作的代码,有人可以帮助我吗?

Rin*_*eri 12

您可以使用WebViewClient.shouldOverrideUrlLoading来检测WebViewClient上的每个URL更改

  • 它无法通过javascript检测到URL更改,这不会导致网页重新加载. (31认同)
  • 你应该使用`shouldOverrideUrlLoading(WebView,WebResourceRequest)`来代替@JoaquinIurchuk. (2认同)

Shu*_*ang 12

对于那些通过javascript加载网址.有一种方法可以通过JavascriptInterface检测网址更改.这里我以youtube为例.使用JavaScriptInteface有异步问题,幸运的是它只是一个回调在这里,所以这将是更少的问题.请注意,必须存在@javascriptinterface注释.

{
    youtubeView.getSettings().setJavaScriptEnabled(true);
    youtubeView.setWebViewClient(mWebViewClient);
    youtubeView.addJavascriptInterface(new MyJavaScriptInterface(),
            "android");
    youtubeView.loadUrl("http://www.youtube.com");

}

WebViewClient mWebViewClient = new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        view.loadUrl("javascript:window.android.onUrlChange(window.location.href);");
    };
};

class MyJavaScriptInterface {
    @JavascriptInterface
    public void onUrlChange(String url) {
        Log.d("hydrated", "onUrlChange" + url);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么要使用 MyJavaScriptInterface 而可以直接在 onPageFinished 中工作? (3认同)
  • @ShuZhang,我已经添加了所有内容。我也尝试在班级不工作换行。 (2认同)

grA*_*uit 12

我知道我迟到了比赛,但是我一遍又一遍地遇到了这个问题……我终于找到了一种直截了当的选择。只需重写WebViewClient.doUpdateVisitedHistory

override fun doUpdateVisitedHistory(view: WebView?, url: String?, isReload: Boolean) {
    // your code here
    super.doUpdateVisitedHistory(view, url, isReload)
}
Run Code Online (Sandbox Code Playgroud)

它适用于所有url更改,即使是JavaScript更改!

如果这不能使您开心,那么我不知道会怎样:)

  • 已确认,此解决方案适用于每个 url 更改,包括 js url 更改,无需重新加载整个页面。 (5认同)
  • 让我们免于漫长的搜索,谢谢!有用。 (2认同)

Ric*_*chi 7

我用了这个方法:

webView.setWebChromeClient(new WebChromeClient()
        {
            @Override public void onProgressChanged(WebView view, int newProgress) {
                if (view.getUrl().equals(mUrl))
                {

                }
                else
                {
                    mUrl = view.getUrl();
                    // onUrlChanged(mUrl) // url changed
                }
                super.onProgressChanged(view, newProgress);
            }
        };
);
Run Code Online (Sandbox Code Playgroud)

mUrl是一个字段String...


Vin*_*ins 5

如果您重写WebViewClient的此方法,则可以处理url更改和javascript url更改:

public class YXWebViewClient extends WebViewClient {

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
    super.onPageStarted(view, url, favicon);
    Log.i("Listener", "Start");

}

@Override
public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);
    Log.i("Listener", "Finish");
   }

}
Run Code Online (Sandbox Code Playgroud)

然后在您的WebView中设置WebViewClient

 yxWebViewClient = new YXWebViewClient();
 webview.setWebViewClient(yxWebViewClient);
Run Code Online (Sandbox Code Playgroud)