Проблема с Android WebView при переопределении загрузки URL-адреса

Я пытаюсь переопределить загрузку URL-адреса при нажатии на ссылку в приложении WebView.

Страница загружается, но WebView сохраняет последнюю позицию прокрутки и размер содержимого.

Есть ли какой-то параметр, который я забыл установить в WebView, чтобы сбросить размер содержимого и положение прокрутки при следующей загрузке?

Вот как я это использую:

@SuppressLint("SetJavaScriptEnabled")
@AfterViews
protected void afterViews() {
  webView.getSettings().setJavaScriptEnabled(true);
  webView.setWebViewClient(new WebClient());
  webView.setWebChromeClient(new ChromeClient());
  webView.loadUrl(url);
}
public class WebClient extends WebViewClient {
  @Override
  public boolean shouldOverrideUrlLoading(WebView view, String url) {
    boolean isValidEmail = url.startsWith("mailto:") && Patterns.EMAIL_ADDRESS.matcher(url.substring("mailto:".length())).matches();
    boolean isValidPhone = url.startsWith("tel:") && Patterns.PHONE.matcher(url.substring("tel:".length())).matches();
    if (url.startsWith("about:")) {
      return super.shouldOverrideUrlLoading(view, url);
    }
    if (isValidEmail) {
      Intent sendIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse(url));
      startActivity(Intent.createChooser(sendIntent, ""));
    } else {
      if (isValidPhone) {
        Intent dialIntent = new Intent(Intent.ACTION_DIAL, Uri.parse(url));
        startActivity(Intent.createChooser(dialIntent, ""));
      } else {
        WebViewActivity.this.setPageTitle(url);
        webView.loadUrl(url);
      }
    }
    return true;
  }
  @Override
  public void onPageFinished(WebView view, String url) {
    //..
  }
}

public class ChromeClient extends WebChromeClient {
  @Override
  public void onProgressChanged(WebView view, int progress) {
    //...
  }
}

Спасибо.


person Cezar Alexandru Vancea    schedule 21.08.2015    source источник


Ответы (2)


Вы пытались установить положение прокрутки в onPageFinished?

@Override
public void onPageFinished(WebView view, String url) {
    // other code...
    view.scrollTo(0,0);
}

Это должно вернуть содержимое WebView вверх, а не в старую позицию прокрутки.

Редактировать 1:

Иногда, если страница загружается в течение длительного времени, это не будет работать должным образом, поэтому мы должны дождаться полной загрузки страницы:

@Override
public void onPageFinished(WebView view, String url) {
    view.postDelayed(new Runnable() {
            @Override
            public void run() {
                webView.scrollTo(0, 0);
            }
        // Delay the scrollTo to make it work
        }, 300);
}

Обратите внимание, что на этот раз webView — это не WebView из метода onPageFinished, а WebView, полученный из макета (тот же, что и в методе afterViews()).

person Bojan Kopanja    schedule 21.08.2015
comment
Делал, никакого эффекта. Другие идеи? - person Cezar Alexandru Vancea; 23.08.2015
comment
Я обновил свой ответ... Попробуйте добавить некоторую задержку в onPageFinished, так как это может не всегда работать, если для загрузки страницы требуется некоторое время. - person Bojan Kopanja; 23.08.2015

@Bojan Kopanja, мои искренние извинения за введение в заблуждение. Оказывается, у меня был веб-просмотр внутри тяги, чтобы обновить слушателя с помощью прокрутки, и удаление этого избавило от проблемы. Тем не менее спасибо за вашу помощь.

person Cezar Alexandru Vancea    schedule 23.08.2015