`shouldOverrideUrlLoading` 真的被弃用了吗?我可以用什么代替?
Is `shouldOverrideUrlLoading` really deprecated? What can I use instead?
"shouldOverrideUrlLoading" 真的被弃用了吗?如果可以,我可以用什么代替?
似乎 shouldOverrideUrlLoading
已被弃用 targeting 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 给我的消息:
Overrides deprecated method in 'android.webkit.WebViewClient'
This inspection reports where deprecated code is used in the specified inspection scope.
Google says nothing about that deprecation.
我想知道使用 @SuppressWarnings("deprecation")
是否能让我在自 API 19 到最新的 Android N Beta(及其发布时的最终版本)的所有设备上工作,我自己无法测试,我从未使用过它,我需要确保它能正常工作,所以,有人能告诉我吗?
The version I'm using I think is the good one, since is the exact same as the Android Developer Docs, except for the name of the string, they used "view" and I used "webview", for the rest is the same
不,不是。
N Developer Preview 的新功能具有此方法签名:
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
包括N在内的所有Android版本都支持的方法签名为:
public boolean shouldOverrideUrlLoading(WebView view, String url)
So why should I do to make it work on all versions?
覆盖已弃用的参数,即采用 String
作为第二个参数的参数。
使用
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return shouldOverrideUrlLoading(view, request.getUrl().toString());
}
为未来的读者详细记录:
简短的回答是您需要重写这两种方法。 shouldOverrideUrlLoading(WebView view, String url)
方法在 API 24 中被弃用,shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
方法在 API 24 中被添加。如果你的目标是旧版本的 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
方法想出类似的方法。
像下面一样实现已弃用和未弃用的方法。第一个是处理 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
}
}
"shouldOverrideUrlLoading" 真的被弃用了吗?如果可以,我可以用什么代替?
似乎 shouldOverrideUrlLoading
已被弃用 targeting 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 给我的消息:
Overrides deprecated method in 'android.webkit.WebViewClient' This inspection reports where deprecated code is used in the specified inspection scope.
Google says nothing about that deprecation.
我想知道使用 @SuppressWarnings("deprecation")
是否能让我在自 API 19 到最新的 Android N Beta(及其发布时的最终版本)的所有设备上工作,我自己无法测试,我从未使用过它,我需要确保它能正常工作,所以,有人能告诉我吗?
The version I'm using I think is the good one, since is the exact same as the Android Developer Docs, except for the name of the string, they used "view" and I used "webview", for the rest is the same
不,不是。
N Developer Preview 的新功能具有此方法签名:
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
包括N在内的所有Android版本都支持的方法签名为:
public boolean shouldOverrideUrlLoading(WebView view, String url)
So why should I do to make it work on all versions?
覆盖已弃用的参数,即采用 String
作为第二个参数的参数。
使用
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return shouldOverrideUrlLoading(view, request.getUrl().toString());
}
为未来的读者详细记录:
简短的回答是您需要重写这两种方法。 shouldOverrideUrlLoading(WebView view, String url)
方法在 API 24 中被弃用,shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
方法在 API 24 中被添加。如果你的目标是旧版本的 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
方法想出类似的方法。
像下面一样实现已弃用和未弃用的方法。第一个是处理 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
}
}