- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
问题很简单。在应用程序中,我们希望跟踪显示的当前 url。为此,我们使用来自 WebViewClient
的 shouldOverrideUrlLoading
回调,方法是在每次更新时将 url 保存到类字段中。相关代码如下:
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setDomStorageEnabled(true);
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
mCurrentUrl = url;
// If we don't return false then any redirect (like redirecting to the mobile
// version of the page) or any link click will open the web browser (like an
// implicit intent).
return false;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
...
}
});
mWebView.loadUrl(mInitialUrl);
但是,至少存在一种情况,即永远不会触发回调并且不会更新 mCurrentUrl 字段。
网址:https://m.pandora.net/es-es/products/bracelets/556000
最后更新的 url(单击产品时永远不会调用 shouldOverrideUrlLoading):https://m.pandora.net/es-es/products/bracelets
我已经尝试过像 onPageStarted() 这样的回调,但是 url 也被过滤了,而且由于其 protected 代码,上游似乎没有可访问的。
阅读关于 WebView 的 android 文档我发现了这个:
https://developer.android.com/guide/webapps/migrating.html#URLs
在请求资源和解析使用自定义 URL 方案的链接时,新的 WebView 应用了额外的限制。例如,如果您实现诸如 shouldOverrideUrlLoading() 或 shouldInterceptRequest() 之类的回调,则 WebView 只会针对有效的 URL 调用它们。
但仍然没有意义,因为上面的 url 是通用的,应该符合标准。
有什么替代方案或解决方案吗?
最佳答案
当您单击该网页上的产品时,它会使用 JavaScript 加载新内容并使用 HTML5 History APIs 更新地址栏中的可见 URL。 .
来自上面的 MDN 文章:
This will cause the URL bar to display http://mozilla.org/bar.html, but won't cause the browser to load bar.html or even check that bar.html exists.
这些有时称为 single-page applications .由于实际加载的页面没有改变,因此不会调用页面加载的 WebView 回调。
如果您确切地知道要拦截哪种 HTTP 请求,则可以使用为每个请求调用的 shouldInterceptRequest
回调。 Web 应用程序很可能会从 API 加载一些数据,例如当产品显示时,您随后可以检测到这些数据。
如果无法检测到这一点,但您可以控制 Web 应用程序,则可以使用 Android JavaScript interface直接从网页调用 Android 应用程序中的方法。
如果您无法控制加载的页面,您仍然可以尝试 inject a local JavaScript file进入网页和observe when the history APIs are used ,然后通过 JS 接口(interface)调用 Android 应用程序中的方法。我尝试使用上一个链接中描述的方法在 Chrome 中观察这些事件,它似乎工作正常。
关于android - WebViewClient 不调用 shouldOverrideUrlLoading,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39979950/
当在我的 WebView 中单击链接时,我使用 shouldoverrideurlloading 来触发函数。他们是一种在单击链接时阻止 webview 加载新屏幕的方法吗?我想做的就是当用户单击链接
我重写了 WebViewClient 的方法 shouldOverrideUrlLoading,当手机连接到互联网时它工作正常,但当互联网未连接时它不会接到电话。谁能解释可能是什么原因?我正在使用安卓
当我尝试显示 PDF 文件时,这段代码创建了一个无限循环,我该如何避免? 谢谢。 mWebview.setWebViewClient(new WebViewClient() { @O
如果我单击 web View 中的链接,则 shouldOverrideUrlLoading() 永远不会被调用。(它不显示 toast 或记录任何内容)。我也尝试过 onPageFinished 并
我正在使用这种方法 -并返回 true 或 super.shouldOverrideUrlLoading(view,url);我为自己的天真道歉,但我不明白返回 true 或父类(super clas
我将 shouldOverrideUrlLoading 方法用于针对多个客户端进行个性化设置的应用程序。每个客户端都有自己的网页,需要加载到 webview 中。我的问题是:该应用程序非常适合客户 A
在我的应用程序中,shouldOverrideUrlLoading() 未在 4.0.3 版本上调用。我已经在 2.2 和 4.0.1 上测试过,它们都工作正常。设备名称是 HTC verizon。
我正在尝试在 webview 中加载 URL 但它没有调用 shouldOverrideUrlLoading webview.setWebViewClient(new HelloWebViewCli
嗨,这对我不起作用: webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrl
我以html格式调用本地存储中的文件并在webview中显示。在我的 html 中包含一个 url,它将单击并显示在同一个 webview 中。但是当我调用 shouldOverrideUrlLoad
在我的应用程序中,第一次有一个登录屏幕显示在 WebView 中。在该屏幕中将出现一个弹出窗口,其中包含用户名和密码。在按下登录按钮时提供详细信息后,提交用户名和密码,它将调用 php 代码进行用户名
我的代码: public class View_WebView extends Activity { WebView myWebView; private class MyW
public WebView mywebview; @Override protected void onCreate(Bundle savedInstanceState) { super.o
我正在尝试弄清楚如何在 Swift for IOS 中使用 shouldOverrideUrlLoading (Android)。我想从 webview 中捕获 URL 而不是加载该 URL。 swi
我正在制作一个电子书阅读器,它使用 epub 格式将书籍加载到 webview 中。在某些书中,同一章的某些部分有一个 anchor 链接。每章都以 html 格式加载。这是链接的样子 file://
问题很简单。在应用程序中,我们希望跟踪显示的当前 url。为此,我们使用来自 WebViewClient 的 shouldOverrideUrlLoading 回调,方法是在每次更新时将 url 保存
我正在使用 WebViewClient.shouldOverrideUrlLoading捕捉 WebView 中的任何链接点击。这在大约 95% 的时间都有效,但有时根本不会被调用。 我在这三种情况下
在我的应用程序中,在 Honeycombe 3.2 版本上未调用 shouldOverrideUrlLoading()。我已经在 2.2 和 4.0.1 上测试过,它们都工作正常。 这是 Honeyc
我的应用程序中有这段代码: public class Home extends Activity{ @Override public void onCreate(Bundle savedInstanc
HTML 文件中有两种类型的链接: (1) A normal link like http://www.bbb.com/q?type=normal (2) A short link like /q?t
我是一名优秀的程序员,十分优秀!