FindViewById sonucunu yayınlamaya gerek yok mu?


152

Son zamanlarda AndroidStudio'nun bazı sınıf oyuncularını kaldırmamı hatırlattığını buldum. Eski zamanlarda, findViewById sonucunu yayınlamamız gerektiğini hatırlıyorum, ama şimdi gerekli değil.

FindViewById sonucu hala Görünüm, bu yüzden neden sınıf döküm gerek yok bilmek istiyorum?

Bahsettiğim herhangi bir belgeyi bulamıyorum, kimse bulabilir mi?


7
çünkü şimdi <T extends View> T findViewById(int id)?
Selvin

ViewView'de olmayan herhangi bir işlem durumunda, ImageView durumunda olduğu gibi döküm yapmanız gerekir, setImageResource kullanmak istiyorsanız, ImageView ile GaView
Deep

Ama "gereksiz" döküm kaldırılırsa bir bakışta değişken türü bilmek biraz rahatsızlık hissediyorum.
Meyve

Yanıtlar:


235

API 26'dan başlayarak findViewById, dönüş türü için çıkarım kullanır, böylece artık yayın yapmak zorunda kalmazsınız.

Eski tanım:

View findViewById(int id)

Yeni tanım:

<T extends View> T findViewById(int id)

Yani compileSdken az 26 yaşındaysanız, bundan faydalanabileceğiniz anlamına gelir :)


Teşekkürler ve başka bir soru. sdk yöneticisi sdk26 için kaynak bulamıyorum, bu yüzden bu yeni tanımı nerede bulabilirim lütfen?
Eric Zhao

17
Oyuncuyu kaldırırsak, uygulamalarımız yine de daha düşük cihazlarda çalışabilir, değil mi?
user1032613

17
@ user1032613: Evet, uygulamalar sorun yaşamadan daha düşük cihazlarda çalışabilir.
Alireza Noorali

1
Yanlış tipte bir istisna atar mı?
fobbymaster

1
Düzen dosyasındaki görünüm farklı türde ise? Evet, elbette, yine de bir olurdu ClassCastException.
Eduard B.

13

Bu makaleye göre :

Aşağıdaki işlev, manuel döküm ihtiyacını ortadan kaldırmak için Java'nın jenerik otomatik tür çıkarımına dayanır:

protected <T extends View> T findViewById(@IdRes int id) {
    return (T) getRootView().findViewById(id);
}

11

Eski sürümlerde:

AutoCompleteTextView name = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView);

SDK 26 ile Android Studio 3.0'dan:

AutoCompleteTextView name = findViewById(R.id.autoCompleteTextView);

16
Bu sorunun cevabını sağlamaz.
Wijay Sharma

1

Görünürlük veya onClick () gibi bazı yaygın yöntemler gibi View sınıfından ortak özellikler kullanıyorsanız Android Studio yayınlamayı kaldırmayı hatırlatır

Örneğin:

((ImageView) findViewById(R.id.image_car)).setVisibility(View.VISIBLE);

Bu durumda şunları yazabilirsiniz:

findViewById(R.id.image_car).setVisibility(View.VISIBLE);

2
hala türü bildirmek zorunda, yazmak gerekir: findViewById <ImageView> (R.id.image_car) .setVisibility (View.VISIBLE);
Slickelito

Android Studio, Java'nın jenerik otomatik tür çıkarımının uygulanmasında değiştiği için açık dökümleri kaldırmamızı hatırlatıyor - kullandığınız yöntemle hiçbir ilgisi yok.
zeroDivider

1

Android 0, temiz döküm

Google'ın IO 2017'de duyurduğu şeylerden biri, 'dökülmüş' olarak adlandırılan bir şeydir :). Android geliştiricisinin findViewById () için manuel bir döküm yapması gerekmez. Örneğin findViewById () kullanarak metin görünümü almanın eski yolu böyle bir şey olacaktır.

TextView txtDesc = (TextView) findViewById(R.id.textViewDesc);
txtDesc.setText(getString(R.string.info_angkot_description));

Yeni yol böyle olurken

TextView txtDesc = findViewById(R.id.textViewDesc);
txtDesc.setText(getString(R.string.info_angkot_description));

Bu basit bir değişiklik. Ancak deneyimli bir programcı için böyle temiz bir kod sizi çok mutlu edebilir ve kodlama ruh halinize yardımcı olur :)

Bunu yapabilmek için sadece proje derlenmiş sdk sürümünü uygulama build.gradle sürüm 26 olarak ayarlamanız gerekiyordu.

Yine de önceki sdk sürümünü de hedefleyebilirsiniz, bu yüzden müdahaleci olmayan bir değişikliktir.

Şimdi asıl sorun, tüm bu süre boyunca döküm kullanan eski kodu nasıl temizliyorsunuz. Özellikle yüzlerce etkinlik dosyanız varsa. Manuel olarak yapabilir veya yapmak için bir stajyer kiralayabilirsiniz 😛. Ama neyse ki tüm bu stajyer için, android stüdyo zaten bu konuda bize yardımcı olmaya hazır.

Eğer caret koymak (veya gereksiz döküm tıklayın) android stüdyo gereksiz döküm işlemek için 2 seçenek önerecektir.

Öncelikle bu gereksiz kadroyu kaldırmanızı öneririz veya temizleme kodunu seçebilirsiniz. Bu dosya için yedekli dökümlerin tümünü kaldıracak. Bu daha iyi, ama daha fazlasını istiyoruz. Her dosyayı açmak istemiyoruz ve bunu tek tek temizlemek istiyoruz.

IntelliJ fikrini Özel yapan şeylerden biri de niyet eylemi adı verilen bir özellik. Tek yapmanız gereken ctrl + shift + A tuşlarına basın ve ardından temiz yazın. Kod Temizleme işlemini seçin ve tüm proje kapsamını seçin. Bu birkaç basit adımla kodunuz çok daha temiz olacaktır.

Önemli bir nokta, bunu bazı kod sürümleme sistemi ile yapmanızdır. Bu şekilde niyet eylemi tarafından yapılan değişiklikleri karşılaştırabilir ve istediğiniz dosyaları geri alabilirsiniz.

Orijinal gönderiden kopyalandı:

https://medium.com/@abangkis/android-0-clean-up-casting-c30acec56cef


1
soru şu whydeğildi how:The result of findViewById is still View, so i want to know why we don't need to cast the class?
zeroDivider

"Tek yapmanız gereken ctrl + shift + A tuşlarına basmak ve sonra temiz yazmak". "Tip temiz" ile ne demek istiyorsun? Bu noktada yazmaya başlarsanız, tüm dosyayı
silersiniz

0

Kaynak kodunda ViewGroup, dönüş argümanının bir kadrosu vardır. Yani tekrar yayınlamaya gerek yok:

@Nullable
public final <T extends View> T findViewById(@IdRes int id) {
    if (id == NO_ID) {
        return null;
    }
    return findViewTraversal(id);
}

@Override
protected <T extends View> T findViewTraversal(@IdRes int id) {
    if (id == mID) {
        return (T) this;  //###### cast to T
    }

    final View[] where = mChildren;
    final int len = mChildrenCount;

    for (int i = 0; i < len; i++) {
        View v = where[i];

        if ((v.mPrivateFlags & PFLAG_IS_ROOT_NAMESPACE) == 0) {
            v = v.findViewById(id);

            if (v != null) {
                return (T) v; //###### cast to T
            }
        }
    }

    return null;
}
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.