Android的WebView的默认行为是否已更改为在内部打开所有链接?

Kam*_*hev 11 android webview

我注意到,随着Google System WebView的上次更新,我的WebView中的所有链接都在视图中打开.但根据谷歌的文档:

public boolean shouldOverrideUrlLoading(WebView视图,String url)在API级别1中添加

当新Web将要加载到当前WebView中时,为主机应用程序提供接管控件的机会.如果未提供WebViewClient,则默认情况下WebView将要求活动管理器为URL选择正确的处理程序.如果提供了WebViewClient,则返回true表示主机应用程序处理url,而return false表示当前WebView处理url.对于使用POST"方法"的请求,不调用此方法.

我没有提供自定义WebViewClient.

注意:我注意到问题的设备是HTC One,其中包含2015年6月8日起的最新Google System WebView

Com*_*are 9

我可以重现这些发现.Android系统WebView 43.0.2357.121展示了您描述的行为,而我升级到它之前的版本没有.

我已就此提交了一份错误报告,现在需要进行更多测试并警告全世界.

感谢您指出了这一点!

UPDATE

这是我在这个主题上写的博客文章.引用自己的话:

我目前的建议是:

  • 总是附上WebViewClient你的WebView

  • 始终贯彻shouldOverrideUrlLoading()WebViewClient

  • 始终返回true以表明您正在处理该事件

  • 始终执行您的应用需要完成的任务,无论是将URL加载到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
  }
}
Run Code Online (Sandbox Code Playgroud)

(您可以将业务逻辑放在哪里shouldKeepInWebView()以确定给定的URL是否应该保留在WebView 或启动浏览器)

  • @stefano:`return(true)`是旧的C/C++语法,是早期Java开发中的惯例.请参阅:http://stackoverflow.com/questions/4216723/function-return-writing-style-in-java IOW,我正在踢它老了,哟. (2认同)