基本内部链接在蜂窝应用程序中不起作用?

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)

Mis*_*cha 3

这是我的解决方法代码,因此该错误对用户来说是透明的。
为浏览器定义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 上的问题。