【问题标题】:Android detect webview URL changeAndroid检测webview URL更改
【发布时间】:2012-03-07 22:09:13
【问题描述】:

我的 android 应用中有一个 webview,想检测 url 何时发生变化。

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

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

【问题讨论】:

标签: android url webview


【解决方案1】:

我知道我玩游戏迟到了,但我一遍又一遍地遇到这个问题......我终于找到了一个非常直接的解决方案。只需覆盖WebViewClient.doUpdateVisitedHistory

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

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

如果这不能让你快乐,那我不知道会怎样:)

【讨论】:

  • 已确认,此解决方案适用于所有 url 更改,包括 js url 更改,无需重新加载整个页面。
  • 让我们免于长时间的搜索,谢谢!它有效。
  • 这应该是公认的答案。当前接受的答案不适用于由 javascript(history.push 等)触发的 URL 更改
  • 发出 POST 请求时不会触发。服务器返回 302 重定向时不会触发。
【解决方案2】:

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

【讨论】:

  • 它无法检测到 javascript 的 URL 更改,这不会导致网页重新加载。
  • @HelinWang 有没有其他检测方法
  • @HelinWang,你有检测到 javascript 重定向的代码吗?
  • API 24 中已弃用的解决方案
  • 你应该使用shouldOverrideUrlLoading(WebView, WebResourceRequest) 而不是@JoaquinIurchuk 提到的。
【解决方案3】:

对于那些通过 javascript 加载 url。有一种方法可以通过 JavascriptInterface 检测 url 的变化。这里我以 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);
    }
}

【讨论】:

  • 为什么要使用 MyJavaScriptInterface 而可以直接在 onPageFinished 中工作?
  • javascript:window.android.onUrlChange(window.location.href);是 javascript 语言在 webview 中工作。 JavascriptInterface 实际打印 url。由于 webview 通过 javascript 加载 url,onPageFinished 仍然传递原始 url,但您实际上已经输入了一个新 url。
  • @Shu Zhang,不工作,我的网页使用 javascript 重定向但不工作。请帮忙。
  • 网页中需要添加onUrlChange吗?
  • @ShuZhang,我已经添加了所有这些。我也尝试过在不工作的类中换行。
【解决方案4】:

如果您覆盖 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");
   }

}

然后在你的 WebView 中设置 WebViewClient

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

【讨论】:

    【解决方案5】:

    我用了这个方法:

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

    mUrlString...

    【讨论】:

    • 因为我的情况只能使用 WebChromeClient,这对我很有帮助。非常感谢!
    【解决方案6】:

    方法 onPageFinished 似乎至少在现代 WebView 中有效。

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

        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】:

          我遇到了一个有趣的问题,让我想到了这个问题,并且很高兴提供一个解决方案,如果他们因 googlebingyahoo 搜索而出现这种情况,它可能会帮助其他人。

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

          mWebView.resumeTimers();
          

          如果您想了解更多信息,这里是link to the doco

          希望它可以减轻其他人我所经历的痛苦,并且很高兴有人告诉我应该以另一种方式实现它。

          【讨论】:

            【解决方案10】:

            我遇到了同样的问题。所以我通过覆盖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) 方法以在页面加载过程结束时获取新 URL。

            【讨论】:

              【解决方案11】:

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

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

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

              @Override
              public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {
                  super.doUpdateVisitedHistory(view, url, isReload);
                  String currentUrl = view.getUrl();
              }
              

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

              :)

              【讨论】:

              • 我该如何使用这个函数,我试图实现它,但是我得到一个错误:这个方法没有覆盖它的超类中的方法?!顺便说一下,我尝试在 webview 类中搜索方法并找不到它!
              • @JosephAli 你应该在你的 WebViewClient 对象中覆盖这个方法
              【解决方案12】:

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

              【讨论】:

                【解决方案13】:

                这将有助于检测由 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();
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-12-05
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-01-30
                  • 2020-07-10
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多