Android 基本内部链接don';在蜂巢应用程序中不工作?

Android 基本内部链接don';在蜂巢应用程序中不工作?,android,hyperlink,webview,internal,Android,Hyperlink,Webview,Internal,在我发布的应用程序中,Android版本3中的内部链接似乎不起作用。此时,我的应用程序以Froyo为目标 这款应用在很多手机上都能正常运行,但我的新Galaxy标签无法处理内部链接!!它可以在html页面中处理它们,即: <a href="#faq">Go to faq</a> <!-- goes to FAQ link --> WTF!webview就在页面上,但您在1秒后回击,它找不到它。它也不能从另一个html页面链接,但在1.x、2.x中都可以正常

在我发布的应用程序中,Android版本3中的内部链接似乎不起作用。此时,我的应用程序以Froyo为目标

这款应用在很多手机上都能正常运行,但我的新Galaxy标签无法处理内部链接!!它可以在html页面中处理它们,即:

<a href="#faq">Go to faq</a>  <!-- goes to FAQ link -->
WTF!webview就在页面上,但您在1秒后回击,它找不到它。它也不能从另一个html页面链接,但在1.x、2.x中都可以正常工作,只是在3.1中不行(没有尝试过3.0)

注:我看到了这个几乎相同的问题: 但我的资产路径中没有空格

我试过使用webclient和不使用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");

这是我的解决方案代码,因此bug对用户是透明的。
为浏览器定义,并为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");
        }
    }
    });

这会让webview先加载不带#链接的页面,然后休眠0.4秒,然后再次加载完整URL。我已选择仅通过sdkVersion对平板电脑执行此操作。如果有任何其他错误,我会加载另一个页面,tableofcontents.html。这可以解决我的Galaxy选项卡上的问题。

这是我使用的解决方案。在所有Android平台上都能实现同样的效果(在所有1.6到4.0.1版本上都进行了测试)

按照正常方式加载文件,不使用定位点。例如:

webview.loadUrl("file:///android_asset/file.html");
加载不带锚点的URL(例如。file:///android_asset/file.html),并加上:

webview.setWebViewClient(new WebViewClient()
{
    public void onPageFinished(WebView view, String url)
    {
        if (this.anchor != null)
        {
            view.loadUrl("javascript:window.location.hash='" + this.anchor + "'");
            this.anchor = null;
        }
    }
});
其中anchor是要跳转到的锚点

您必须确保启用了javascript:

WebSettings webSettings = webview.getSettings();
webSettings.setJavaScriptEnabled(true);
这用于将文件加载到webview中。 现在,如果您想捕获现在已断开的内部链接(如另一个答案中所建议的),请重写onReceivedError方法并插入,执行如下操作:

    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
    {
        int found = failingUrl.indexOf('#');

        if (found > 0)
        {
            anchor = failingUrl.substring(found + 1, failingUrl.length());
            view.loadUrl(failingUrl.substring(0, found));
        }
    }

我也有同样的问题,你有没有找到解决办法?这个网站似乎在谈论类似的事情,但它没有提供任何解决方案……几个月后,除了检测3.x操作系统并切断URL的内部链接之外,我仍然没有其他解决方案。该功能受到阻碍,但它避免了未发现的错误。在onReceivedError中,当URL失败时触发,我检测到姜饼上面的任何操作系统,并切掉内部链接以获得基本的网页URL。然后我将其加载到webview中,并将睡眠延迟1/2秒。然后,我用内部链接加载原始的failedURL,瞧,它现在加载了。显然,浏览器犯了一个典型的错误,即试图在链接存在之前访问它。如果有人有更多关于这个错误的情报,我洗耳恭听!还有一个bug报告:-我们应该将自己添加到其中。这种情况发生在我身上,没有任何内部链接……我不知道为什么会被否决,但感谢你,没有什么,解决办法确实有效。如果你打算否决它,它还可以与其他符号(即?而不是#)配合使用。你至少可以解释一下自己!这修复了我们发布的应用程序上的问题。这应该是没有必要的,但无论是谁投票否决了它,都需要解释,而不是仅仅是痛恨它,如果它不起作用的话。但是我没有内部链接。顺便说一句:还有一个bug报告:如果你一开始没有内部链接,那么我看不到我的内部链接解决方案会起作用还是不起作用?它没有。还有另一个(不相关)问题:
webview.setWebViewClient(new WebViewClient()
{
    public void onPageFinished(WebView view, String url)
    {
        if (this.anchor != null)
        {
            view.loadUrl("javascript:window.location.hash='" + this.anchor + "'");
            this.anchor = null;
        }
    }
});
WebSettings webSettings = webview.getSettings();
webSettings.setJavaScriptEnabled(true);
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
    {
        int found = failingUrl.indexOf('#');

        if (found > 0)
        {
            anchor = failingUrl.substring(found + 1, failingUrl.length());
            view.loadUrl(failingUrl.substring(0, found));
        }
    }