Является ли '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'. Эта проверка сообщает, где устаревший код используется в указанной области проверки.
Google ничего не говорит об этом осуждении.
Интересно, если использование @SuppressWarnings("deprecation")
позволит мне работать на всех устройствах, начиная с API 19 до последней версии Android N Beta (и ее окончательной версии, когда она выйдет), я не могу протестировать ее сам, я никогда не использовал что и мне нужно быть уверенным, что это работает, так что, кто-нибудь может сказать?
Ответы
Ответ 1
Версия, которую я использую, я думаю, является хорошей, так как она точно такая же, как Документы для разработчиков Android, за исключением названия строки, они использовали "view", а я использовал "webview", в остальном то же самое
Нет.
Тот, что является новым для N Developer Preview, имеет следующую подпись метода:
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
Тот, который поддерживается всеми версиями Android, включая N, имеет подпись этого метода:
public boolean shouldOverrideUrlLoading(WebView view, String url)
Итак, почему я должен сделать это, чтобы это работало на всех версиях?
Переопределите устаревший, который принимает String
в качестве второго параметра.
Ответ 2
Подробное документирование для будущих читателей:
Короткий ответ: вам нужно переопределить оба метода. Метод shouldOverrideUrlLoading(WebView view, String url)
устарел в API 24, а метод shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
добавлен в API 24. Если вы ориентируетесь на более старые версии андроида, вы нуждаетесь в прежнем методе, и если вы нацеливаете 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
.
Ответ 3
Используйте
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
view.loadUrl(request.getUrl().toString());
return true;
}
Ответ 4
Реализуйте как устаревшие, так и не устаревшие методы, как показано ниже. Первый - для обработки уровня 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
}
}