Основные внутренние ссылки не работают в сотовом приложении? - PullRequest
11 голосов
/ 01 июля 2011

Внутренние ссылки не работают в Android версии 3 в моем опубликованном приложении. На этом этапе мое приложение предназначено для Froyo.

Приложение отлично работает на тоннах телефонов, но моя новая Galaxy Tab не может обрабатывать внутренние ссылки! Он может обрабатывать их на html-странице, например:

<a href="#faq">Go to faq</a>  <!-- goes to FAQ link -->

Переход к тегу ниже на той же странице:

<a name="faq" id="faq"></a>  

Однако из другого html-файла, то есть страницы индекса, ссылка больше не работает в сотах:

<a href="mainpage.html#faq">FAQ</a>  <!-- goes to error page -->

Кроме того, если я перехожу на внутреннюю ссылку и оттуда перехожу на ссылку на другую страницу, а затем нажимаю кнопку «Назад» (она переопределяется для перехода на предыдущую страницу веб-просмотра), вы получаете ту же ошибку, т.е.:

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

WTF! Веб-просмотр был только на странице, но вы сделали ответный удар через 1 секунду, и он не может его найти. Он также не может ссылаться на другую html-страницу, но все прекрасно работает в 1.x, 2.x, только не в 3.1 (не пробовал 3.0)

ПРИМЕЧАНИЕ: я видел этот почти идентичный вопрос: android_asset не работает на Honeycomb? Но в моем пути к активам нет пробелов.

Я пробовал с веб-клиентом и без него и пробовал настройки DOM и кэша безрезультатно. Вот пример того, что у меня есть в настоящее время:

        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");

Ответы [ 2 ]

4 голосов
/ 01 февраля 2012

Вот решение, которое я использую. Работает одинаково на всех платформах Android (проверено на всех 1.6 до 4.0.1)

Загрузите файл, как обычно, без точки привязки. E.g.:

webview.loadUrl("file:///android_asset/file.html");

Загрузить URL-адрес без точки привязки (например, файл: ///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;
        }
    }
});

где якорь - это точка привязки, к которой вы хотите перейти.

Вы должны убедиться, что JavaScript включен:

WebSettings webSettings = webview.getSettings();
webSettings.setJavaScriptEnabled(true);

Это для загрузки файла в веб-просмотр. Теперь, если вы хотите перехватить внутренние ссылки, которые теперь не работают, как предложено в другом ответе, переопределите метод 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 голосов
/ 04 сентября 2011

Вот мой обходной код, поэтому ошибка прозрачна для пользователя.
Определите 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");
        }
    }
    });

Это обманывает веб-просмотр, чтобы сначала загрузить страницу без ссылки #, затем спать в течение 0,4 секунды, а затем снова загрузить полный URL-адрес.Я решил сделать этот трюк для планшетов только sdkVersion.Если есть какая-либо другая ошибка, я загружаю другую страницу, tableofcontents.html.Это работает, чтобы исправить проблему на моем Galaxy Tab.

...