"shouldOverrideUrlLoading"は本当に非推奨ですか?もしそうなら、私は代わりに何を使うことができますか?
shouldOverrideUrlLoading
は廃止予定ですAndroid N /をターゲットにしていますそしてAPI 19以来、アプリは今までのAndroid N(beta)まで動作させる必要があります。 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'の廃止予定のメソッドをオーバーライドします。この検査は、廃止予定のコードが指定された検査範囲のどこで使用されているかを報告します。
@SuppressWarnings("deprecation")
を使うことで、API 19から最新のAndroid N Beta(そしてそれがリリースされたときの最終版)までのすべてのデバイスで動作させることができるのでしょうか?私はそれを自分でテストできません。それが機能することを確認してください、そう、誰でも伝えることができますか?
私が使っているバージョンは良いものだと思います。文字列の名前を除いて、Android Developer Docsとまったく同じです。それ以外は同じです。
いいえそうではありません。
N Developer Previewの新しいものには、このメソッドシグニチャーがあります。
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
Nを含むすべてのAndroidバージョンでサポートされているものには、このメソッドシグネチャがあります。
public boolean shouldOverrideUrlLoading(WebView view, String url)
では、なぜ私はそれをすべてのバージョンで機能させるためにやるべきなのでしょうか?
2番目のパラメータとしてString
を取る廃止予定のものをオーバーライドしてください。
将来の読者のために詳細に文書化する:
簡単に言えば、両方の方法をオーバーライドする必要があるということです。 shouldOverrideUrlLoading(WebView view, String url)
メソッドはAPI 24で廃止され、shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
メソッドはAPI 24で追加されました。もしあなたが古いバージョンのAndroidをターゲットにしているのなら、あなたはneedを使います。 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
メソッドのための同様のアプローチを思いつくことができます。
つかいます
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
view.loadUrl(request.getUrl().toString());
return true;
}
以下のように、非推奨のメソッドと非推奨のメソッドの両方を実装します。 1つ目はAPIレベル21以上を処理することであり、2つ目は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
}
}