"ShouldOverrideUrlLoading" gerçekten kullanımdan kaldırıldı mı? Bunun yerine ne kullanabilirim?


138

"ShouldOverrideUrlLoading" gerçekten kullanımdan kaldırıldı mı? Öyleyse, bunun yerine ne kullanabilirim?

Görünüşe göre Android N'yi hedefleyenshouldOverrideUrlLoading kullanımdan kaldırıldı ve API 19'dan bu yana en son Android N (beta) olana kadar bir uygulama çalışması yapmam gerekiyor, Android N'de (Veri Tasarrufu gibi) yeni bazı özellikler kullanıyorum, bu yüzden hedefleme Marshmallow bu yeni özellikleri kullanmam gerektiğinden bu konuda yardımcı olmayacak, işte kullandığım kodun bir parçası:

public boolean shouldOverrideUrlLoading(WebView webview, String url) {
    if (url.startsWith("http:") || url.startsWith("https:")) {
        ...
    } else if (url.startsWith("sms:")) {
        ...
    }
    ...
}

Ve bu Android Studio'nun bana verdiği mesaj:

'Android.webkit.WebViewClient' içindeki kullanımdan kaldırılmış yöntemi geçersiz kılar Bu inceleme, kullanımdan kaldırılan kodun belirtilen denetim kapsamında nerede kullanıldığını bildirir.

Google, bu kullanımdan kaldırma hakkında hiçbir şey söylemiyor .

Kullanmanın @SuppressWarnings("deprecation"), API 19'dan en son Android N Beta'ya kadar (ve yayınlandığında son sürümü) tüm cihazlarda çalışmasına izin verip vermeyeceğini merak ediyorum , kendim test edemiyorum, bunu hiç kullanmadım ve emin olmak zorundayım işe yarıyor, yani, herkes anlatabilir mi?


1
Bu geri çağrı yönteminin iki sürümü vardır. Eskisi onaylanmadı. Bu durumda, "kullanımdan kaldırıldı" demek "hey, sizin için uygunsa denemek isteyebileceğiniz başka bir şeyimiz var". Android'in N öncesi sürümleri için eski geri arama gerektiğinden, eski geri arama çalışmaya devam etmelidir.
CommonsWare

İlk olarak, yorum için teşekkürler, kullandığım sürüm iyi olduğunu düşünüyorum, çünkü Android Geliştirici Dokümanlar ile tam olarak aynı, dize adı hariç, onlar "görünüm" kullandım ve "webview" kullandım , geri kalanı te aynı, bu yüzden neden tüm sürümlerde çalışması için yapmalıyım?
Minion

Yanıtlar:


95

Kullandığım sürüm iyi olduğunu düşünüyorum, çünkü Android Geliştirici Dokümanları ile tam olarak aynı, dize adı hariç, onlar "görünüm" kullandım ve "webview" kullandım, gerisi aynı

Hayır öyle değil.

N Geliştirici Önizlemesi'nde yeni olanın yöntem imzası vardır:

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

N dahil tüm Android sürümleri tarafından desteklenen sürümde şu yöntem imzası vardır:

public boolean shouldOverrideUrlLoading(WebView view, String url)

Öyleyse neden tüm sürümlerde çalışmasını sağlamak için yapmalıyım?

Kullanımdan kaldırılmış olanı, Stringikinci parametre olarak a alanını geçersiz kılın .


Merhaba ve cevap için teşekkürler, bu hala API 19 beri uyumlu değil, çünkü URL dizesini almak için "url.getUrl (). ToString ()" kullanmak zorunda ve herhangi bir şekilde API 21 eklenmiştir 19'dan beri çalışıyor mu?
Minion

3
@Minion: "API 19'dan beri hala uyumlu değil" - evet, öyle. "URL dizesini almak için kullanmalıyım" url.getUrl (). toString () "" - hayır, URL ikinci parametre olarak a şeklinde sağlanır String. Örneğin, API Seviyesi 19'a göre derlenen bu örnek uygulama , Android 6.0 destekli bir Nexus 5 gibi iyi çalışıyor.
CommonsWare

Merhaba, "WebResourceRequest isteği" kullanmanın bir String parametresi yok
Minion

2
@Minion: Doğru. Bu yalnızca Android N'de (ve muhtemelen daha yüksekte) çalışır. "Öyleyse neden tüm sürümlerde çalışması için yapmalıyım?" Diye sordunuz. Kullanımdan kaldırılmış olanı, Stringikinci parametre olarak a alanını geçersiz kılmanızı söyledim . Örneğin, kullanımdan kaldırılmış geri aramayı geçersiz kılan örnek uygulama, N Geliştirici Önizleme 1'i çalıştıran bir Nexus 6'da iyi çalışıyor
CommonsWare

6
Geleceğe dönük olmak istiyorsanız, aslında İKİ yöntemleri geçersiz kılabilirsiniz. Bu şekilde uygulamanız <21 üzerinde çalışmaya devam eder, ancak eski yöntemi tamamen kullanımdan kaldırmaya hazır olursunuz. Ve endişelenmenize gerek kalmayacak, getUrl()çünkü yeni yöntem sadece 24+ için çağrılacak
yuval

187

Gelecekteki okuyucular için ayrıntılı dokümantasyon:

Kısa cevap, her iki yöntemi de geçersiz kılmanızdır. shouldOverrideUrlLoading(WebView view, String url)Yöntem API 24'de artık kullanılmamaktadır ve shouldOverrideUrlLoading(WebView view, WebResourceRequest request)yöntem API 24. eklenir android eski sürümlerini hedefliyorsanız, sen lüzum sen 24 hedefliyorsanız (daha sonra veya birisi uzak gelecekte bu okuyor,) eski yöntem ve ikinci yöntemin de geçersiz kılınması önerilir.

Aşağıda bunu nasıl başaracağınıza dair iskelet verilmiştir:

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;
        }
    }
}

Tıpkı shouldOverrideUrlLoadingshouldInterceptRequest yöntem için de benzer bir yaklaşım geliştirebilirsiniz .


6
@ webo80 Aslında API24 / N geliştiricisine
Henry

3
@RequiresApiGelecekte kullanmak için @TargetApi yerine kullanmak daha iyidir
Hibbem

1
Her iki yöntemi de geçersiz kılma sorunu, en azından shouldInterceptRequestAndroid N + cihazlarında her ikisinin de çağrılması ve her uri'yi iki kez ele almanızdır! Bunu düzeltmek için, Build.VERSION.SDK_INT < Build.VERSION_CODES.Nkullanımdan kaldırılmış sürümde bir koşul ekledim .
Jonik

8
@JohnLee Normalde yöntemlerden yalnızca biri çağrılır. Ancak super. shouldOverrideUrlLoading(view,request), kullanımdan kaldırılmamış bir yöntem koyacaksanız , evet hem kullanımdan kaldırılmış hem de kullanımdan kaldırılmış yöntem çağrılır. Bunun nedeni, kullanımdan kaldırılmış yöntemin varsayılan uygulamasının, kullanımdan kaldırılmış yöntemi dahili olarak çağırmasıdır. Sadece bir göz atın WebViewClient.shouldOverrideUrlLoading(WebView view, WebResourceRequest request). Bu yüzden aramadığınızdan emin olun super.shouldOverrideUrlLoading().
Henry

1
Sadece her iki yöntemin çağrılma işlevinin belgelenmediğine dikkat edin. Belgelerde belirtilmediği için her zaman böyle olmasına güvenmem.
Austyn Mahoney

15

kullanım

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

2
view.loadUrl (request.getUrl (). toString ());
Hibbem

onun iş ama biz geri kullanırsanız o zaman uygulamayı kapatacak
MRRaja

4
bu 21'den az
API'leri

-1

Aşağıdaki gibi hem kullanımdan kaldırılan hem de kullanımdan kaldırılan yöntemleri uygulayın. Birincisi API seviye 21 ve daha üstünü işlemek, ikincisi API seviye 21'den daha düşük işlemek

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
        }
}

1
Bu, Henry'nin cevabının kısmi bir kopyası gibi görünüyor, ancak bu Uri.parseve ile döndürülen değeri atıyor parseUri. Yeni cevaplar konuya faydalı yeni bilgiler ve yeni bilgiler eklemelidir.
AdrianHHH

API 21'de değil API 24'te kullanımdan kaldırıldığı için zaman kaybettirdi
Gustavo Baiocchi Costa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.