Какое рекомендуемое событие для обновления интерфейса навигации WebView?
WebView
предлагает goBack()
и goForward()
для реализации типичного поведения кнопки "назад", которое может быть привязано к кнопкам, элементам панели действий или что-то еще:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case R.id.back:
if (webView.canGoBack()) {
webView.goBack();
}
break;
case R.id.fwd:
if (webView.canGoForward()) {
webView.goForward();
}
break;
case R.id.reload:
webView.reload();
break;
default:
return(super.onOptionsItemSelected(item));
}
return(true);
}
WebView
также имеет canGoBack()
и canGoForward()
, чтобы рассказать вам, являются ли эти жизнеспособные опции заданными текущей историей навигации в WebView
, показанной выше, как защита вокруг вызовов goBack()
и goForward()
.
В теории canGoBack()
и canGoForward()
могут использоваться для включения или отключения кнопок, элементов панели действий или чего-то еще. Это даст вам типичный пользовательский интерфейс браузера, где кнопки "Назад" и "Вперед" доступны только пользователю, если они будут иметь реальный эффект.
Что не очевидно, когда мы должны звонить canGoBack()
и canGoForward()
и включать/отключать эти кнопки. Должно ли быть:
-
onPageStarted()
в пользовательском WebViewClient
?
-
doUpdateVisitedHistory()
в пользовательском WebViewClient
?
- в каком-то другом обратном вызове?
- какая-то комбинация из них?
- каждую секунду или так чисто по таймеру, потому что у нас нет надежного обратного вызова для определения того, когда они должны обновляться?
Ответы
Ответ 1
Документы canGoBack()
в настоящее время state, что он возвращает true, если
этот WebView имеет элемент истории назад
canGoForward()
имеет аналогичный Javadoc.
Проблема заключается в том, что она не была задокументирована, когда была изменена предыстория. Это будет целиком зависеть от внедрения WebView (Client), и это может измениться в будущем. Это может быть даже на разных устройствах Android/версиях/вилках.
doUpdateVisitedHistory()
также четко не документирован:
Уведомлять хост-приложение об обновлении его посещенной базы данных ссылок.
Проблема заключается в том, что он не указывает WHEN, что он вызывается, только чтобы обновить ваши посещенные ссылки. Его можно было бы назвать раньше или позже, чем вы пожелаете, в зависимости от реализации WebView (Client).
Я думаю, что ваш выбор зависит от того, насколько безопасно вы хотите сделать свой код против возможных сбоев.
Лично я бы пошел с обновлением в onPageStarted()
, onPageFinished()
и doUpdateVisitedHistory()
, потому что он работает во всех разумно ожидаемых условиях и не имеет накладных расходов на производительность опроса с помощью таймера.
Затем я проверил его на устройствах нескольких брендов и версий Android, чтобы убедиться, что он ведет себя так, как я ожидаю.
Если он все равно не работает, можно рассмотреть возможность применения механизма таймера/опроса.
Ответ 2
Вы можете проверить с помощью методов canGoBack() и canGoForward() в обратном вызове onPageFinished. Таким образом, вы знаете, что новая страница только что закончила загрузку, поэтому вы можете проверить, может ли веб-просмотр идти вперед или назад, а затем включать/отключать ваши кнопки.
Я использовал его таким образом, и он отлично работает