158

「shouldOverrideUrlLoading」は本当に非推奨ですか? その場合、代わりに何を使用できますか?

Android N を対象とshouldOverrideUrlLoadingするのは非推奨のようです。API 19 以降、最新の Android N (ベータ) までアプリを機能させる必要があります。Android N の新しい機能 (データセーバーなど) を使用しているので、これらの新機能を使用する必要があるため、マシュマロは問題を解決しません。使用するコードの一部を次に示します。

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 はその非推奨について何も言いません

API 19以降、最新のAndroid Nベータ(およびリリース時の最終バージョン)まで、すべてのデバイスで使用できるかどうか疑問に思い@SuppressWarnings("deprecation")ます。自分でテストすることはできません。使用したことがないため、確認する必要がありますそれは機能するので、誰でもわかりますか?

4

4 に答える 4

210

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

簡単な答えは、両方のメソッドをオーバーライドする必要があるということです。この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

于 2016-07-20T14:28:46.177 に答える
106

私が使用しているバージョンは、文字列の名前を除いて Android Developer Docs とまったく同じであるため、良いバージョンだと思います。「view」を使用し、「webview」を使用しました。残りは同じです

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

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

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

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

public boolean shouldOverrideUrlLoading(WebView view, String url)

では、なぜすべてのバージョンで動作させる必要があるのでしょうか?

String非推奨のもの、 2 番目のパラメーターとしてa を取るものをオーバーライドします。

于 2016-04-07T18:47:43.850 に答える