Подтвердить что ты не робот

Какое рекомендуемое событие для обновления интерфейса навигации 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?
  • в каком-то другом обратном вызове?
  • какая-то комбинация из них?
  • каждую секунду или так чисто по таймеру, потому что у нас нет надежного обратного вызова для определения того, когда они должны обновляться?
4b9b3361

Ответ 1

Документы canGoBack() в настоящее время state, что он возвращает true, если

этот WebView имеет элемент истории назад

canGoForward() имеет аналогичный Javadoc.

Проблема заключается в том, что она не была задокументирована, когда была изменена предыстория. Это будет целиком зависеть от внедрения WebView (Client), и это может измениться в будущем. Это может быть даже на разных устройствах Android/версиях/вилках.

doUpdateVisitedHistory() также четко не документирован:

Уведомлять хост-приложение об обновлении его посещенной базы данных ссылок.

Проблема заключается в том, что он не указывает WHEN, что он вызывается, только чтобы обновить ваши посещенные ссылки. Его можно было бы назвать раньше или позже, чем вы пожелаете, в зависимости от реализации WebView (Client).

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

Лично я бы пошел с обновлением в onPageStarted(), onPageFinished() и doUpdateVisitedHistory(), потому что он работает во всех разумно ожидаемых условиях и не имеет накладных расходов на производительность опроса с помощью таймера.
Затем я проверил его на устройствах нескольких брендов и версий Android, чтобы убедиться, что он ведет себя так, как я ожидаю.
Если он все равно не работает, можно рассмотреть возможность применения механизма таймера/опроса.

Ответ 2

Вы можете проверить с помощью методов canGoBack() и canGoForward() в обратном вызове onPageFinished. Таким образом, вы знаете, что новая страница только что закончила загрузку, поэтому вы можете проверить, может ли веб-просмотр идти вперед или назад, а затем включать/отключать ваши кнопки.

Я использовал его таким образом, и он отлично работает