【问题标题】:Android WebView issue on override url loading覆盖 url 加载时的 Android WebView 问题
【发布时间】:2015-08-21 15:38:21
【问题描述】:

我正在尝试在单击应用 WebView 上的链接时覆盖 url 加载。

页面加载,但 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) {
    //...
  }
}

谢谢。

【问题讨论】:

    标签: android webview android-webview webviewclient webchromeclient


    【解决方案1】:

    您是否尝试在 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不是onPageFinished方法中的WebView,而是layout中获取的WebView(和afterViews()方法中的一样)。

    【讨论】:

    • 我做了,没有效果。其他想法?
    • 我已经更新了我的答案...尝试在 onPageFinished 中添加一些延迟,因为如果页面需要一些时间加载,这可能并不总是有效
    【解决方案2】:

    @Bojan Kopanja,对于误导我深表歉意。 事实证明,我将 webview 放入了一个带有滚动视图的拉动刷新侦听器中,并删除了该问题。 不过还是感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 2017-07-30
      相关资源
      最近更新 更多