Является ли" shouldOverrideUrlLoading " действительно устаревшим? Что я могу использовать вместо этого?



у меня есть вопрос/проблема, действительно ли "shouldOverrideUrlLoading" устарел? Если да, то что я могу использовать вместо этого?



кажется shouldOverrideUrlLoading осуждается таргетинг на Android N и мне нужно, чтобы приложение работало с API 19 до последнего прямо сейчас, который является Android N (бета), я использую некоторые функции, которые являются новыми В Android N (например, Data Saver), поэтому таргетинг Marshmallow не поможет с этой проблемой, так как мне нужно использовать эти новые функции, вот часть кода I использование:



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 (и ее финала версия, когда она будет выпущена), я не могу проверить ее сам, я никогда не использовал это, и мне нужно быть уверенным, что это работает, так что кто-нибудь может сказать?



Спасибо большое.

844   3  

3 ответов:

версия, которую я использую, я думаю, хорошая, так как она точно такая же, как документы разработчика Android, за исключением имени строки, они использовали "view", а я использовал "webview", для остальных это то же самое

нет, это не так.

тот, который является новым для предварительного просмотра N Developer, имеет эту подпись метода:

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

тот, который поддерживается всеми версиями Android, включая N, имеет этот метод подпись:

public boolean shouldOverrideUrlLoading(WebView view, String url)

так почему я должен сделать, чтобы заставить его работать на всех версиях?

переопределите устаревший, тот, который принимает String в качестве второго параметра.

детальное документирование для будущих читателей:

короткий ответ - вам нужно переопределить оба метода. Элемент 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 метод.

использовать

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

Comments

    Ничего не найдено.