我的Android应用程序中有一个webview,想要检测网址何时发生变化。
当用户在info.php页面上时,我想用它来隐藏顶栏中的信息按钮,当他不在info.php页面时再显示它。
我用谷歌搜索但找不到任何正常工作的代码,有人可以帮助我吗?
答案 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()。
:)