Geçerli etkinlikten kök görünümü alma


634

View.getRootView () ile kök görünümü almak biliyorum . Ayrıca onClick, argümanın bir Görünüm olduğu bir düğmenin olayından görünümü elde edebiliyorum . Ancak bir etkinlikte görüşü nasıl alabilirim ?


3
Etkinlikte, normal olarak hangi kaynağı kullanması gerektiğini setContentView()ve sağladığınız görünümün zaten kök olduğunu belirtirsiniz. Bu görünümün işlenmesine ihtiyacınız varsa, XAML'de ona bir kimlik koyun ve findViewById()iyi olur.
xandy

Benim planım kodu dinamik olarak iliştirmektir .. Kullanıcılarım api kullanıyorsa ben otomatik olarak bir şeyler tespit olmasını bekliyoruz .. Boulder'ın çözümü işe yarıyor!
Lalith

4
@xandy: hafif bir yazım hatası: XAML -> XML.
superjos

Yanıtlar:


1048

Etkinliğinizin kök görünümüne ihtiyacınız varsa (içeriğinizi oraya ekleyebilirsiniz)

findViewById(android.R.id.content).getRootView()

Ayrıca bazı cihazlarda kullanmanız gerektiği bildirildi

getWindow().getDecorView().findViewById(android.R.id.content)

yerine.

Booger'ın bildirdiği gibi, bunun bazı cihazlarda gezinme çubuğunun arkasında (geri düğmesi vb.) Olabileceğini lütfen unutmayın (ancak çoğu cihazda öyle görünmemektedir).

Etkinliğinize setContentView()yöntem kullanarak eklediğiniz görünümü almanız gerekiyorsa pottedmeat'in yazdığı gibi kullanabilirsiniz

final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);

Ancak, xml düzeninizde kimliği bu görünüme ayarlamanız ve bunun yerine bu kimliği kullanmanız daha iyi olur.


194
Aslında findViewById (android.R.id.content) bana kök görünümü veriyor. Bu doğru değilse bazı durumlarda findViewById (android.R.id.content) .getRootView () kök görünümü alabilirsiniz. Cevap için teşekkürler. Android hakkında daha fazla bilgiyi nereden alabilirim? Farkında değildim.
Lalith

4
Burada kontrol edebilirsiniz geliştirici.android.com/ reference/android/R.html Sadece android kaynakları referans olduğunu varsayalım . Şahsen ben android.R.id.content öğrendim sonra hiyerarşi görüntüleyici düzenleri kontrol.
Dmitry Ryadnenko

14
Bu görünümün durum çubuğunu içerdiğini fark ettim, bu nedenle etkinliğinizin görünür kısmını arıyorsanız, @pottedmeat'ın yanıtını kullanın.
Ben Clayton

5
@Lalith, findViewById (android.R.id.content) .getRootView () yapmanız gerektiğinde biraz ayrıntı verebilir misiniz? Genel bir kuralı bilmek gerçekten yararlı olacaktır.
batbrat

2
@batbrat Eylem çubuğunu kullanırken Android 5.0+ sürümünde .getRootView () kullanmam gerekiyor
Morten Holmgaard

264

Bu atanan XML dosyasında bulunan kök görünümünü almak için kullandığım şey setContentView:

final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);

33
Bu cevap, durum çubuğu olmadan görünümü verdi - istediğim buydu. Etkinliğin görünür kısmının piksel genişliği + yüksekliğini arıyordum. Bu işe yarıyor, teşekkürler!
Ben Clayton

9
Bu, ActionBar!
Wayne

4
Eklemenin bir yolu var mı ActionBar?
theblang

3
Buradaki anahtar kelimeler "XML dosyasında bulunan kök görünümdür". Teşekkür ederim.
Kacy

3
Bu doğru işaretli cevap olmalıdır. Bu Snackbar'ı Faaliyetinizin içine (kökte) yerleştirecektir, bu da olması gereken yerdedir (kimsenin bilgilerini Nav Düğmelerinin arkasına yerleştirmek istemediğinden eminim)
Booger

136

Bunu sadece android 4.0.3'te test ettim:

getWindow().getDecorView().getRootView()

aynı görüşü bizden aldık

anyview.getRootView();

com.android.internal.policy.impl.PhoneWindow$DecorView@#########

ve

getWindow().getDecorView().findViewById(android.R.id.content)

çocuğunu vermek

android.widget.FrameLayout@#######

Lütfen onaylayın.


5
Android2.3.3 aynı görünüyor
ruX

2
4.3 Çalışır En kolay yolu ve bulduğum en az kod miktarı.
Oliver Dixon

10
SnackBar
zackygaurav

getWindow (). getDecorView (). getRootView (). getHeight () görüntüleme yüksekliğini döndürür.
vovahost

3
getWindow (). getDecorView (). getRootView () snack bar için önerilmez, sistem gezinme çubuğuyla çakışacak, findViewById (android.R.id.content) daha iyi olacaktır.
thanhbinh84

31

Geçerli etkinlikten kök görünümü alın.

Faaliyetlerimiz içerisinde aşağıdakileri elde edebiliriz root:

ViewGroup rootView = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);

veya

View rootView = getWindow().getDecorView().getRootView();

20

Kotlin'de bunu biraz daha kısa yapabiliriz:

val rootView = window.decorView.rootView

19

Sadece birinin daha kolay bir yola ihtiyacı olduğunu düşünün:

Aşağıdaki kod, tüm etkinliğin bir görünümünü verir:

View v1 = getWindow().getDecorView().getRootView();

Etkinlikte certian bir görünüm elde etmek için, örneğin etkinliğin içine bir imageView, almak istediğiniz o görünümün kimliğini eklemeniz yeterlidir:

View v1 = getWindow().getDecorView().getRootView().findViewById(R.id.imageView1);

Umarım bu birine yardımcı olur


5
Yalnızca findViewById(R.id.imageView1);belirli bir görünüm istiyorsanız etkinliği arayabilirsiniz .
RobCo


2

Kotlin Uzatma Çözümü

Bir Etkinlikteki erişimi basitleştirmek için bunu kullanın. Daha sonra doğrudan rootViewFaaliyet'ten veya activity.rootViewbunun dışından başvurabilirsiniz :

val Activity.rootView get() = window.decorView.rootView

Aynı şeyi tutarlılık için Fragmanlar için eklemek isterseniz, şunu ekleyin:

val Fragment.rootView get() = view?.rootView

1

Mevcut Etkinliğin Görünümünü Almak

herhangi bir onClick'te "View view" ı alıyor olacağız, 'view' kullanarak rootView olsun.

Görünüm view = view.getRootView ();

ve parçayı görüntüle

Görünüm view = FragmentClass.getView ();


0

Eğer bir aktivitedeyseniz, sadece tek bir kök görünüm olduğunu varsayalım, bunu böyle alabilirsiniz.

ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
        .findViewById(android.R.id.content)).getChildAt(0);

daha sonra gerçek sınıfınıza atabilirsiniz

ya da kullanabilirsin

getWindow().getDecorView();

bunun işlem çubuğu görünümünü içereceğine dikkat edin, görünümünüz işlem çubuğu görünümünün altında


ActivitySınıfta böyle bir yöntem yoktur .
onelaview

window.decorView veya window.decor ViewGroup olarak görüntüle - ViewGroup'a yayınlamanız gerekiyorsa
Edgar Khimich

0

Veri Bağlama Kitaplığı'nı kullananlar için , geçerli etkinliğin kökünü almak için şunları kullanın:

View rootView = dataBinding.getRoot();

Ve Kotlin kullanıcıları için, daha da basit:

val rootView = dataBinding.root

0

Başka bir Kotlin Extension çözümü

Etkinliğinizin görünümü xml (ör. activity_root.xml) Olarak bildirilmişse, xml'yi açın ve kök görünüme bir kimlik atayın:

android:id="@+id/root_activity"

Şimdi sınıfınızda, görünümü kullanarak şunları içe aktarın:

import kotlinx.android.synthetic.main.activity_root.root_activity

Artık root_activitygörünüm olarak kullanabilirsiniz .

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.