Якорная ссылка Android Webview (ссылка перехода) не работает

у меня есть 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", "");

6 ответов


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


анкерная ссылка Android Webview (ссылка перехода) не работает

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.


мое решение , проверьте этот ответ

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; 
                } 
            } 

        }); 
    } 
} 

у меня была похожая проблема. Ничто не будет переходить к привязке тегов в 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>

WebView в Android 4.0 не удается открыть URL-адреса со ссылками в них. например. "файл: / / / 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 + "';");
    }
}

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

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