是否“shouldOverrideUrlLoading”真的弃用? 我可以用什么来代替?

我有一个问题/问题,是否“shouldOverrideUrlLoading”真的弃用? 如果是这样,我可以使用什么?

看起来像shouldOverrideUrlLoading已弃用针对Android N ,我需要使一个应用程序工作,因为API 19,直到最新的权利,现在是Android N(testing版),我使用一些function,在Android N(如数据保护程序)针对棉花糖将无助于这个问题,因为我需要使用这些新function,这里是我使用的代码的一部分:

 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(以及它最终发布的版本)时,我都无法自己testing它,我需要确定它是有效的,那么,任何人都可以告诉?

非常感谢。

我使用的版本我认为是好的,因为除了string的名称,它们和Android开发者文档完全一样,他们使用“view”,我使用“webview”,其余部分是相同的

不它不是。

N开发人员预览版的新版本有这种方法签名:

 public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) 

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

 public boolean shouldOverrideUrlLoading(WebView view, String url) 

那么为什么我应该做所有版本的工作呢?

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

为未来的读者详细logging:

简短的答案是你需要重写这两个方法。 在API 24中不推荐使用shouldOverrideUrlLoading(WebView view, String url)方法,并且在API 24中添加shouldOverrideUrlLoading(WebView view, WebResourceRequest request)方法。如果您针对的是早期版本的Android,则需要使用前一种方法,如果您是针对24(或更高版本,如果有人在遥远的将来阅读),build议覆盖后一种方法。

下面是你如何完成这个的骨架:

 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 // eg open web page in a Browser final Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); return true; } } } 

就像shouldOverrideUrlLoading ,你可以想出一个类似的方法为shouldInterceptRequest方法。

使用

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