\`shouldOverrideUrlLoading\` 真的被弃用了吗?我可以用什么代替?

新手上路,请多包涵

“shouldOverrideUrlLoading”真的被弃用了吗?如果是这样,我可以用什么代替?

似乎 shouldOverrideUrlLoading 针对 Android N 已被弃用,我需要让应用程序从 API 19 开始工作,直到现在最新的 Android N(测试版),我使用 Android N 中的一些新功能(像 Data Saver 一样),因此定位 Marshmallow 对解决问题没有帮助,因为我需要使用这些新功能,这是我使用的代码的一部分:

 public boolean shouldOverrideUrlLoading(WebView webview, String url) {
    if (url.startsWith("http:") || url.startsWith("https:")) {
        ...
    } else if (url.startsWith("sms:")) {
        ...
    }
    ...
}

这是 Android Studio 给我的信息:

覆盖“android.webkit.WebViewClient”中不推荐使用的方法此检查报告在指定检查范围内使用不推荐使用的代码的位置。

谷歌对这种弃用只字未提

我想知道使用 @SuppressWarnings("deprecation") 是否可以让我在从 API 19 到最新的 Android N Beta(及其发布时的最终版本)的所有设备上工作,我自己无法测试,我从未使用过那我需要确保它有效,所以,任何人都可以告诉?

原文由 Minion 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

我使用的版本我认为是好的版本,因为它与 Android Developer Docs 完全相同,除了字符串的名称,他们使用“view”,我使用“webview”,其余相同

不它不是。

N Developer Preview 的新功能具有以下方法签名:

 public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

所有 Android 版本(包括 N)都支持的那个具有以下方法签名:

 public boolean shouldOverrideUrlLoading(WebView view, String url)

那么我为什么要让它适用于所有版本呢?

覆盖已弃用的一个,即采用 String 作为第二个参数的那个。

原文由 CommonsWare 发布,翻译遵循 CC BY-SA 4.0 许可协议

为未来的读者详细记录:

简短的回答是您需要覆盖这两种方法。 API 24 中不推荐使用 — shouldOverrideUrlLoading(WebView view, String url) 方法,API 24 中添加了 shouldOverrideUrlLoading(WebView view, WebResourceRequest request) 方法。 24(或以后,如果有人在遥远的将来阅读此书)建议也覆盖后一种方法。

以下是有关如何完成此任务的框架:

 class CustomWebViewClient extends WebViewClient {

    @SuppressWarnings("deprecation")
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        final Uri uri = Uri.parse(url);
        return handleUri(uri);
    }

    @TargetApi(Build.VERSION_CODES.N)
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        final Uri uri = request.getUrl();
        return handleUri(uri);
    }

    private boolean handleUri(final Uri uri) {
        Log.i(TAG, "Uri =" + uri);
        final String host = uri.getHost();
        final String scheme = uri.getScheme();
        // Based on some condition you need to determine if you are going to load the url
        // in your web view itself or in a browser.
        // You can use `host` or `scheme` or any part of the `uri` to decide.
        if (/* any condition */) {
            // Returning false means that you are going to load this url in the webView itself
            return false;
        } else {
            // Returning true means that you need to handle what to do with the url
            // e.g. open web page in a Browser
            final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
            startActivity(intent);
            return true;
        }
    }
}

就像 shouldOverrideUrlLoading 一样,您可以为 shouldInterceptRequest 方法提出类似的方法。

原文由 Henry 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题