web-dev-qa-db-ja.com

`shouldOverrideUrlLoading`は本当に非推奨ですか?代わりに何が使えますか?

"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(そしてそれがリリースされたときの最終版)までのすべてのデバイスで動作させることができるのでしょうか?私はそれを自分でテストできません。それが機能することを確認してください、そう、誰でも伝えることができますか?

114
Minion

私が使っているバージョンは良いものだと思います。文字列の名前を除いて、Android Developer Docsとまったく同じです。それ以外は同じです。

いいえそうではありません。

N Developer Previewの新しいものには、このメソッドシグニチャーがあります。

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

Nを含むすべてのAndroidバージョンでサポートされているものには、このメソッドシグネチャがあります。

public boolean shouldOverrideUrlLoading(WebView view, String url)

では、なぜ私はそれをすべてのバージョンで機能させるためにやるべきなのでしょうか?

2番目のパラメータとしてStringを取る廃止予定のものをオーバーライドしてください。

80
CommonsWare

将来の読者のために詳細に文書化する:

簡単に言えば、両方の方法をオーバーライドする必要があるということです。 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メソッドのための同様のアプローチを思いつくことができます。

167
Henry

つかいます

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

以下のように、非推奨のメソッドと非推奨のメソッドの両方を実装します。 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
        }
}
0
emr