Android检测webview URL更改

时间:2012-02-16 13:53:00

标签: android url webview

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

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

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

13 个答案:

答案 0 :(得分:12)

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

\W

答案 1 :(得分:10)

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

答案 2 :(得分:4)

如果您覆盖此WebViewClient方法,您将能够处理网址更改,并且javascript网址会发生变化:

 yxWebViewClient = new YXWebViewClient();
 webview.setWebViewClient(yxWebViewClient);

然后在WebView中设置WebViewClient

{ "fooId" : "1", "status" : "A", "timestamp" : ISODate("2016-01-01T00:00:00.000Z") "otherInfo" : "BAR", ... }
{ "fooId" : "1", "status" : "B", "timestamp" : ISODate("2016-01-02T00:00:00.000Z") "otherInfo" : "BAR", ... }
{ "fooId" : "1", "status" : "C", "timestamp" : ISODate("2016-01-03T00:00:00.000Z") "otherInfo" : "BAR", ... }
{ "fooId" : "2", "status" : "A", "timestamp" : ISODate("2016-01-01T00:00:00.000Z") "otherInfo" : "BAR", ... }
{ "fooId" : "2", "status" : "B", "timestamp" : ISODate("2016-01-02T00:00:00.000Z") "otherInfo" : "BAR", ... }
{ "fooId" : "3", "status" : "A", "timestamp" : ISODate("2016-01-01T00:00:00.000Z") "otherInfo" : "BAR", ... }
{ "fooId" : "3", "status" : "B", "timestamp" : ISODate("2016-01-02T00:00:00.000Z") "otherInfo" : "BAR", ... }
{ "fooId" : "3", "status" : "C", "timestamp" : ISODate("2016-01-03T00:00:00.000Z") "otherInfo" : "BAR", ... }
{ "fooId" : "3", "status" : "D", "timestamp" : ISODate("2016-01-04T00:00:00.000Z") "otherInfo" : "BAR", ... }

答案 3 :(得分:2)

尝试使用onLoadResource。即使您正在使用,它也会被调用至少一次 JS改变你的网址。但它可能被称为不止一次,所以要小心。

答案 4 :(得分:2)

方法onPageFinished似乎至少在现代WebViews中起作用。

答案 5 :(得分:1)

我遇到了一个有趣的问题,让我回答了这个问题,很高兴能够提供一个可以帮助其他人的解决方案,如果他们这样做是因为googlebingyahoo搜索。

mwebVew.reload()在我从登录用户或注销用户的首选项屏幕返回后,不会选择我想要加载的新URL。它会更好地更新共享首选项,但不会更新和替换url网页。因此,在几个小时没有看到答案之后,我尝试了以下内容,并且它起到了真正的作用。

mWebView.resumeTimers();

如果您想了解更多信息,请参阅link to the doco

希望它可以拯救别人我经历过的痛苦,并且很高兴有人告诉我,我应该以另一种方式实施。

答案 6 :(得分:1)

我遇到了同样的问题。所以我通过覆盖public void onPageStarted(WebView view, String url, Bitmap favicon)方法解决了这个问题,如下所示:

 webView.setWebViewClient(new WebViewClient(){

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon)
    {
        // Here you can check your new URL.
        Log.e("URL", url);
        super.onPageStarted(view, url, favicon);
    }

 });

此外,您可以覆盖public void onPageFinished(WebView view, String url)方法,以便在页面加载过程结束时获取新网址。

答案 7 :(得分:1)

我使用了这种方法:

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

mUrl String ...

字段

答案 8 :(得分:1)

rinkal-bhanderi 的答案的实现如下所示:

class MyWebClient(
    private val myCustomMethod: () -> Unit) : WebViewClient() {
  
  override fun shouldOverrideUrlLoading(view: WebView?,
      url: String?): Boolean {
      myCustomMethod()
      return true
    }
  }
}

你会像这样使用它:

webview.webViewClient = MyWebClient(::hideButton)

其中 webview 是您通过调用 FindViewById 获得的实际 webview 或您从绑定中获得的对象引用。而 hideButton 是在最后一个表达式被评估的同一范围内可访问的方法。

答案 9 :(得分:0)

这将有助于检测由javascript引起的重定向。

WebViewClient mWebViewClient = new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            view.loadUrl("javascript:window.android.onUrlChange(window.location.href);");            }
    };
    myWebView.setWebViewClient(mWebViewClient);
    }
@JavascriptInterface
public void onUrlChange(String url) {
    Toast.makeText(mContext, "Url redirected",Toast.LENGTH_SHORT).show();
}

答案 10 :(得分:0)

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

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

它适用于所有url更改,甚至包括javascript更改!

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

答案 11 :(得分:0)

当基本/主机URL更改时,使用WebViewClient.shouldOverrideUrlLoading()。如果基本URL不会像在单页应用程序中那样发生变化,并且使用javascript检测到URL更改不会导致网页重新加载,则使用webview的Use WebViewClient.doUpdateVisitedHistory()方法。 @海伦王

答案 12 :(得分:0)

我的要求是根据URL的变化来处理页面中浮动按钮的可见性。

如果url从https / ooooo / /登录更改为https / ooooo / /首页 它可能未在onPageFinished或shouldOverrideUrlLoading中注册。 这就是我面临的问题。

我通过以下方法解决了该问题:

@Override public void doUpdateVisitedHistory (WebView视图,字符串url,布尔值isReload){

                   super.doUpdateVisitedHistory(view, url, isReload);

String currentUrl = view.getUrl(); }

*请不要使用我们通过doUpdateVisitedHistory方法获得的url。这将是基本的url。因此,请使用view.getUrl()。

:)