Mis*_*cha 11 android internal hyperlink webview
在我发布的应用中,内部链接似乎不适用于Android版本3.我的应用程序目标是Froyo.
该应用程序适用于大量的手机,但我的新Galaxy Tab无法处理内部链接!它可以在html页面中处理它们,即:
<a href="#faq">Go to faq</a> <!-- goes to FAQ link -->
Run Code Online (Sandbox Code Playgroud)
转到同一页面下方的标记:
<a name="faq" id="faq"></a>
Run Code Online (Sandbox Code Playgroud)
但是从另一个html文件,即索引页面,该链接不再适用于Honeycomb:
<a href="mainpage.html#faq">FAQ</a> <!-- goes to error page -->
Run Code Online (Sandbox Code Playgroud)
此外,如果我转到内部链接,并从那里按照指向另一个页面的链接,然后点击后退按钮,(它被覆盖以转到上一个webview页面)你得到相同的错误,即:
The webpage at file:///android_asset/folder/mainpage.html#faq might be temporarily down or it may have moved permanently to a new web address
Run Code Online (Sandbox Code Playgroud)
WTF!webview就在页面上,但是你在1秒后回击,它找不到它.它也不能从另一个html页面链接,但它在1.x,2.x中都可以正常工作,而不是3.1(还没试过3.0)
注意:我已经看到了这个几乎完全相同的问题: android_asset不能在Honeycomb上工作? 但是我的资产路径中没有空格.
我已尝试使用和不使用webclient,并尝试DOM和缓存设置无济于事.这是我目前在oncreate中的一个例子:
browser = new WebView(this);
// browser = (WebView) findViewById(R.id.webkit); // tried with XML and without
browser.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
browser.getSettings().setJavaScriptEnabled(true);
browser.getSettings().setPluginsEnabled(true);
// browser.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
// browser.getSettings().setUseWideViewPort(true);
browser.setBackgroundColor(Color.parseColor("#333333"));
browser.setInitialScale(1);
browser.getSettings().setBuiltInZoomControls(true);
final Activity MyActivity = this;
browser.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
// Make the bar disappear after URL is loaded, and changes
// string to Loading...
setProgressBarIndeterminateVisibility(true);
MyActivity.setTitle(" Loading . . . " + progress + "%");
MyActivity.setProgress(progress * 100); // Make the bar
if (progress == 100) {
setTitle(" APP TITLE YADA YADA");
setProgressBarIndeterminateVisibility(false);
}
}
});
browser.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
{
// Handle the error
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
view.loadUrl(url); // note I tried with and without overriding this
return true;
}
});
setContentView(browser);
browser.loadUrl("file:///android_asset/folder/page.html");
Run Code Online (Sandbox Code Playgroud)
这是我的解决方法代码,因此该错误对用户来说是透明的。
为浏览器定义WebViewClient,并为 onReceivedError 包含类似以下内容:
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
{
if (failingUrl.contains("#")) {
Log.v("LOG", "failing url:"+ failingUrl);
final int sdkVersion = Integer.parseInt(Build.VERSION.SDK);
if (sdkVersion > Build.VERSION_CODES.GINGERBREAD) {
String[] temp;
temp = failingUrl.split("#");
view.loadUrl(temp[0]); // load page without internal link
try {
Thread.sleep(400);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
view.loadUrl(failingUrl); // try again
} else {
view.loadUrl("file:///android_asset/tableofcontents.html");
}
}
});
Run Code Online (Sandbox Code Playgroud)
这会欺骗 webview 首先加载没有 #link 的页面,然后休眠 0.4 秒,然后再次加载完整的 URL。我选择仅通过 sdkVersion 对平板电脑执行此操作。如果有任何其他错误,我将加载另一个页面,即 tableofcontents.html。这可以解决我的 Galaxy Tab 上的问题。
| 归档时间: |
|
| 查看次数: |
7482 次 |
| 最近记录: |