“是否应该重写 UrlLoding”真的被废弃了吗? 我可以使用什么来代替?

“ should OverrideUrlLoding”是否真的不适用? 如果是,我可以使用什么来替代?

看起来 shouldOverrideUrlLoading已经被淘汰了 目标是 Android N,我需要让一个应用程序从 API 19开始工作,直到最近的 Android N (测试版) ,我使用了 Android N 中的一些新特性(比如 Data Saver) ,所以把棉花糖作为目标不会有什么帮助,因为我需要使用这些新特性,下面是我使用的代码的一部分:

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 (以及它发布的最终版本) ,我不能自己测试它,我从来没有使用过它,我需要确保它能工作,所以,谁都可以告诉我?

121958 次浏览

我认为我使用的版本是好的,因为它和 Android 开发者文档完全一样,除了字符串的名字,他们使用了“ view”,我使用了“ webview”,因为其余的都是一样的

不,不是的。

N 开发人员预览版中新出现的那个具有这样的方法签名:

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

包括 N 在内的所有 Android 版本都支持的方法签名如下:

public boolean shouldOverrideUrlLoading(WebView view, String url)

那么我为什么要让它在所有版本上都有效呢?

重写已废弃的参数,即以 String作为第二个参数的参数。

使用

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

为未来的读者详细记录:

简而言之,您需要重写这两个方法。在 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方法提供类似的方法。

实现像下面这样的弃用和非弃用方法。第一个是处理 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
}
}