Изменено ли поведение Android WebView по умолчанию для открытия внутри всех ссылок?

Я заметил, что с последним обновлением Google System WebView все ссылки в моем WebView открываются в самом представлении. Но согласно документации из Google:

public boolean shouldOverrideUrlLoading (представление WebView, строковый URL) Добавлено в уровень API 1

Дайте хост-приложению возможность взять элемент управления, когда новый URL-адрес будет загружен в текущем WebView. Если WebViewClient не предоставлен, по умолчанию WebView попросит Activity Manager выбрать правильный обработчик для URL. Если WebViewClient предоставлен, верните true, это означает, что приложение-хозяин обрабатывает URL-адрес, а return false означает, что текущий WebView обрабатывает URL-адрес. Этот метод не вызывается для запросов с использованием метода POST.

Я не предоставлял пользовательский WebViewClient.

ПРИМЕЧАНИЕ. Устройство, которое я заметил, это HTC One с последним веб-интерфейсом Google System от 8 июня 2015 г.

Ответ 1

Я могу воспроизвести результаты. Android-система WebView 43.0.2357.121 демонстрирует поведение, которое вы описываете, в то время как версия, на которой я был включен, до ее обновления не делала этого.

> отправил отчет об ошибке, и теперь вам нужно больше тестировать и предупреждать мир.

Спасибо, что указали это!

UPDATE

Вот сообщение в блоге, которое я написал на эту тему. Цитата из этого:

Моя рекомендация на данный момент:

  • Всегда присоединяйте WebViewClient к WebView

  • Всегда выполняйте shouldOverrideUrlLoading() на WebViewClient

  • Всегда возвращайте true, чтобы указать, что вы обрабатываете событие

  • Всегда делайте то, что должно было делать ваше приложение, независимо от того, загружается ли оно URL-адрес в WebView или запуск браузера по URL-адресу (скорее чем возвращение false и использование поведения запасов)

Что-то вроде этого статического внутреннего класса, похоже, выполняет трюк — создать экземпляр и передать его на setWebViewClient() на вашем WebView:

private static class URLHandler extends WebViewClient {
  @Override
  public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (shouldKeepInWebView(url)) {
      view.loadUrl(url);
    }
    else {
      Intent i=new Intent(Intent.ACTION_VIEW, Uri.parse(url))
          .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

      view.getContext().startActivity(i);
    }

    return(true);
  }

  private boolean shouldKeepInWebView(String url) {
    return(true); // or false, or use regex, or whatever
  }
}

(где вы бы поставили свою бизнес-логику в shouldKeepInWebView() на определить, должен ли данный URL-адрес оставаться в WebViewили запустить браузер)

Ответ 2

Кажется, эта проблема была решена в 44.0.240.54.