Якорная ссылка Android Webview (Перейти ссылка) не работает - PullRequest
22 голосов
/ 14 июня 2010

У меня есть приложение WebView в моем приложении для Android, которое загружает строку HTML с помощью метода loadDataWithBaseURL ().Проблема в том, что локальные якорные ссылки (<a href="#link"> ...) работают неправильно.Когда ссылка нажата, она подсвечивается, но не прокручивается до соответствующей привязки.

Это также не работает, если я использую метод loadUrl () WebView для загрузки страницы, содержащей ссылки привязки.Однако, если я загружаю тот же URL-адрес в браузере, якорные ссылки работают.

Требуется ли какая-либо специальная обработка, чтобы заставить их работать для WebView?

Я использую API v4(1.6).

Код не так уж много, вот соответствующие части тестового кода, с которым я работал:

WebView detailBody = (WebView) findViewById(R.id.article_detail_body);
String s = "<a href=\"#link\">LINK!</a><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><a name=\"link\"></a>Testing!";
detailBody.loadDataWithBaseURL(API.HomeURL(this), s, "text/html", "utf-8", "");

Ответы [ 7 ]

22 голосов
/ 18 июня 2010

Похоже, проблема в том, что у меня был WebView в ScrollView.WebView не может прокрутить до ссылки привязки при такой настройке.После рефакторинга моего макета для исключения ScrollView ссылки привязки работают правильно.

15 голосов
/ 30 ноября 2011

Ссылка на веб-браузер Android (ссылка перехода) не работает

True, якорные ссылки WebView или переходные ссылки, инициированные через расширение #LINK для URL, не будут работать, когда WebView находится внутри ScrollView (*).

Тем не менее, проблема для меня и, очевидно, для других заключается в том, что #LINK работает, когда запускается от прикосновения в href, но игнорируется при запуске через URL. Другие симптомы включают переход к ссылке только в первый раз в сеансе или переход к нижней части HTML-файла.

Решение состоит в том, чтобы загрузить URL после небольшой задержки.

Вот пример:

Мой HTML-файл сохраняется в ресурсах: res / assets / help.html

С такими анкерами:

<a name="helplinkcontacts"/>

И загружается так:

final String baseUrl = "file:///android_asset/help.html#helplinkcontacts";
final WebView helpTextView = (WebView)findViewById(R.id.help_dialog_text);
helpTextView.loadUrl(baseUrl); // Ignores Anchor!!

Я добавил таймер так:

final String baseUrl = "file:///android_asset/help.html#helplinkcontacts";
final WebView helpTextView = (WebView)findViewById(R.id.help_dialog_text);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        helpTextView.loadUrl(baseUrl);
    }
}, 400);

Примечание. Более короткие задержки, например, 100 мс, не привели к переходу по ссылке.

(*) Оказывается, что у многих из нас есть наши WebViews внутри ScrollViews, потому что мы начали с рендеринга текста в TextView, который поддерживает некоторый HTML и требует ScrollView. В любом случае удалите ScrollView, как только вы преобразуете TextView в WebView.

6 голосов
/ 26 июня 2012

Мое решение: Проверьте этот ответ

public class MainActivity extends Activity { 
    WebView myWebView; 
    public static boolean flag = false; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        myWebView = new WebView(this); 
        myWebView.getSettings().setJavaScriptEnabled(true); 
        myWebView.loadUrl("file:///android_asset/chapters.html"); 
        setContentView(myWebView); 
        myWebView.setWebViewClient(new WebViewClient() { 
            public void onPageFinished(WebView view, String url) { 
                if (url.contains("#") && flag == false) { 
                    myWebView.loadUrl(url); 
                    flag = true; 
                } else { 
                    flag = false; 
                } 
            } 

        }); 
    } 
} 
2 голосов
/ 15 июля 2013

WebView в Android 4.0 не может открыть URL-адреса со ссылками на них.например, «file: ///android_asset/help.html#helplinkcontacts»

Вот как я обошел это

WebView wv = (WebView) nagDialog.findViewById(R.id.wv);
wv.getSettings().setJavaScriptEnabled(true);
wv.setWebViewClient(new MyWebViewClient(link));
wv.loadUrl("file:///android_asset/help.html");

И определил пользовательский класс WebViewClient

class MyWebViewClient extends WebViewClient {
    private String link;

    public MyWebViewClient(String link) {
        this.link = link;
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        if (!"".equals(link) && link != null)
            view.loadUrl("javascript:location.hash = '#" + link + "';");
    }
}
2 голосов
/ 01 сентября 2011

У меня была похожая проблема. Ничто не может перейти к тегам привязки в HTML. У меня не было моего WebView в ScrollView. Вместо этого проблема заключалась в том, что базовый URL, который я передал loadDataWithBaseURL, не содержал двоеточие (':'). Я считаю, что baseUrl должен иметь некоторый текст, затем двоеточие, а затем еще немного текста, например, «app: htmlPage24».

Итак, вот начальный вызов моего WebView, просто чтобы загрузить данные в строку HTML_24:

wv.loadDataWithBaseURL("app:htmlPage24", HTML_24, "text/html", "utf-8", null);

Затем у меня есть список, который переходит к разделам на экране, в зависимости от элемента списка, который вы нажимаете:

sectionsLV.setOnItemClickListener(new OnItemClickListener()
{
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
    {
        wv.loadUrl("app:htmlPage24#section" + arg2);
    }
});

HTML_24 выглядит примерно так:

<html>
...
<a name="section1"/>

...
<a name="section2"/>

...
<a name="section3"/>

...
</html>
1 голос
/ 07 декабря 2018

Я тоже столкнулся с той же проблемой.Якорная ссылка прыгала в произвольную позицию.Следите за тем, чтобы при загрузке не скрывать webview.

Используйте Invisible вместо gone.

Это изменение исправило мою проблему.

0 голосов
/ 15 июня 2010
try this

String myTemplate = "<a href=\"#link\">LINK!</a><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><a name=\"link\"></a>Testing!";

myWebView.loadDataWithBaseURL(null, myTemplate, "text/html", "utf-8", null);

слово "Тестирование!" должно быть за пределами экрана, чтобы увидеть, как это работает.

...