Ответ 1
Похоже, проблема в том, что у меня был WebView в ScrollView. WebView не может прокручивать ссылку привязки при настройке следующим образом. После рефакторинга моего макета, чтобы исключить ScrollView, якорные ссылки работают правильно.
У меня есть приложение 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", "");
Похоже, проблема в том, что у меня был WebView в ScrollView. WebView не может прокручивать ссылку привязки при настройке следующим образом. После рефакторинга моего макета, чтобы исключить ScrollView, якорные ссылки работают правильно.
Правда, ссылки привязки 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 мс, не смогли перейти к ссылке.
(*) Оказывается, многие из нас имеют наши WebView внутри ScrollViews, потому что мы начали с рендеринга TextView Spannable text, который поддерживает некоторый 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);
слово "Тестирование!" должен быть вне экрана, чтобы увидеть, как он работает.
Я также столкнулся с той же проблемой. Якорная ссылка прыгала в произвольное положение. Обязательно не скрывать webview
при загрузке.
Используйте Invisible
вместо того, чтобы gone
.
Это изменение изменило мою проблему.
Решение Ujjwal Goyal сработало для меня, используйте Invisible, а не ушел. пока он загружал страницу, решил проблему