`shouldOverrideUrlLoading`真的被弃用了吗?我可以用什么呢?

时间:2016-04-07 18:11:48

标签: android android-webview deprecated deprecation-warning

是" 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'中不推荐使用的方法。       此检查报告在指定的检查范围内使用弃用代码的位置。

Google says nothing about that deprecation

我想知道使用@SuppressWarnings("deprecation")是否允许我使用自API 19以来的所有设备,直到最新的Android N Beta(及其发布后的最终版本),我无法自己测试,我从来没有使用过它,我需要确定它是否有效,所以,任何人都可以说出来?

4 个答案:

答案 0 :(得分:166)

为将来的读者详细记录:

简短的回答是你需要覆盖这两种方法。 API 24中已弃用shouldOverrideUrlLoading(WebView view, String url)方法,API 24中添加了shouldOverrideUrlLoading(WebView view, WebResourceRequest request)方法。如果您的目标是旧版Android,则需要前一种方法,如果你的目标是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方法提出类似的方法。

答案 1 :(得分:79)

  

我认为使用的版本是好的,因为它与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作为第二个参数的那个。

答案 2 :(得分:13)

使用

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
    view.loadUrl(request.getUrl().toString());
    return true;
}

答案 3 :(得分:0)

同时实现不推荐使用的方法和不推荐使用的方法,如下所示。第一个是处理API级别21和更高级别,第二个是处理低于API级别21

webViewClient = object : WebViewClient() {
.
.
        @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
        override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
            parseUri(request?.url)
            return true
        }

        @SuppressWarnings("deprecation")
        override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
            parseUri(Uri.parse(url))
            return true
        }
}