Uzyskaj widok root z bieżącej aktywności


633

Wiem, jak uzyskać widok główny za pomocą View.getRootView () . Jestem również w stanie uzyskać widok ze onClickzdarzenia przycisku, w którym argumentem jest Widok . Ale jak mogę uzyskać widok w działaniu ?


3
W działaniu zwykle mówisz, którego zasobu powinien on użyć, setContentView()a podany widok jest już katalogiem głównym. Jeśli potrzebujesz uchwytu tego widoku, po prostu umieść go w XAML i findViewById()będzie dobrze.
Xandy

Mój plan polega na dynamicznym dołączaniu kodu ... więc jeśli moi użytkownicy używają interfejsu API, spodziewam się, że automatycznie wykryje rzeczy .. Rozwiązanie Bouldera działa!
Lalith,

4
@xandy: lekka literówka: XAML -> XML.
superjos,

Odpowiedzi:


1048

Jeśli potrzebujesz widoku głównego swojej aktywności (abyś mógł tam dodać swoją zawartość), użyj

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

Zgłoszono również, że na niektórych urządzeniach trzeba używać

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

zamiast.

Należy pamiętać, że jak poinformował Booger, może to być za paskiem nawigacji (z przyciskiem Wstecz itp.) Na niektórych urządzeniach (ale wydaje się, że na większości urządzeń tak nie jest).

Jeśli chcesz zobaczyć widok dodany do swojej aktywności za pomocą setContentView()metody, to jak napisałeś pottedmeat, możesz użyć

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

Ale lepiej po prostu ustaw identyfikator dla tego widoku w układzie XML i użyj tego identyfikatora.


194
Właściwie właśnie findViewById (android.R.id.content) daje mi widok root. Jeśli nie jest to prawdą, w niektórych przypadkach mogę uzyskać widok roota z findViewById (android.R.id.content) .getRootView (). Dziękuję za odpowiedź. Gdzie mogę dowiedzieć się więcej na temat Androida.R? Nie byłam tego świadoma.
Lalith

4
Możesz to sprawdzić tutaj. Przypuszczam, że developer.android.com/reference/android/R.html To tylko odniesienie do zasobów Androida. Osobiście dowiedziałem się o zawartości android.R.id., a następnie sprawdziłem układy w przeglądarce hierarchy.
Dmitry Ryadnenko,

14
Zauważyłem, że ten widok wydaje się zawierać pasek stanu, więc jeśli szukasz widocznej części swojej aktywności, użyj odpowiedzi z @pottedmeat.
Ben Clayton,

5
@Lalith, czy możesz rozwinąć kwestię, kiedy trzeba było znaleźć findViewById (android.R.id.content) .getRootView ()? Przydałaby się ogólna zasada.
batbrat

2
@batbrat Muszę używać .getRootView () w Androidzie 5.0+ podczas korzystania z paska akcji
Morten Holmgaard

264

To jest to, czego używam, aby uzyskać widok główny znaleziony w pliku XML przypisanym z setContentView:

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

33
Ta odpowiedź dała widok bez paska stanu - tego właśnie chciałem. Szukałem szerokości w pikselach + wysokości widocznej części działania. Ten działa, dzięki!
Ben Clayton

9
Nie dotyczy to ActionBar!
Wayne

4
Czy istnieje sposób na uwzględnienie ActionBarrównież?
theblang

3
Kluczowymi słowami są tutaj „widok główny znaleziony w pliku XML”. Dziękuję Ci.
Kacy

3
To powinna być poprawna zaznaczona odpowiedź. Spowoduje to umieszczenie paska przekąsek w Twojej aktywności (w katalogu głównym), czyli tam, gdzie powinno być (jestem prawie pewien, że nikt nie chce umieszczać swoich informacji za przyciskami nawigacji)
Booger

136

Testowałem to w Androidzie 4.0.3, tylko:

getWindow().getDecorView().getRootView()

dać taki sam pogląd, co otrzymujemy

anyview.getRootView();

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

i

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

dając swojemu dziecku

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

Proszę potwierdzić.



2
Działa w 4.3 Jest to najprostszy sposób i najmniejsza ilość kodu, jaką znalazłem.
Oliver Dixon

10
Najlepiej, jeśli używasz SnackBar
zackygaurav

getWindow (). getDecorView (). getRootView (). getHeight () zwraca wysokość wyświetlania.
vovahost

3
getWindow (). getDecorView (). getRootView () nie jest zalecany do paska przekąsek, będzie nakładał się na pasek nawigacji systemu, findViewById (android.R.id.content) będzie lepszy.
thanhbinh84

31

Uzyskaj widok root z bieżącej aktywności.

W ramach naszej działalności możemy uzyskać rootwidok z:

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

lub

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

20

W Kotlinie możemy to zrobić nieco krócej:

val rootView = window.decorView.rootView

19

Po prostu incydent Ktoś potrzebuje łatwiejszego sposobu:

Poniższy kod przedstawia widok całej aktywności:

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

Aby uzyskać widok certian w działaniu, na przykład imageView wewnątrz działania, wystarczy dodać identyfikator tego widoku, który chcesz uzyskać:

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

Mam nadzieję, że to komuś pomoże


5
Możesz po prostu wywołać findViewById(R.id.imageView1);aktywność, jeśli chcesz mieć konkretny widok.
RobCo


2

Rozwiązanie przedłużające Kotlin

Użyj tego, aby uprościć dostęp do działania. Następnie możesz bezpośrednio odnieść się do rootViewdziałania lub activity.rootViewpoza nim:

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

Jeśli chcesz dodać to samo dla Fragmentów dla spójności, dodaj:

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

1

, aby uzyskać widok bieżącej aktywności

w dowolnym onClick dostaniemy „Widok widoku”, używając „widok” pobierz rootView.

View view = view.getRootView ();

i uzyskać fragment w widoku

View view = FragmentClass.getView ();


0

jeśli jesteś w działaniu, załóż, że istnieje tylko jeden widok główny, możesz go uzyskać w ten sposób.

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

możesz rzucić to na swoją prawdziwą klasę

lub możesz użyć

getWindow().getDecorView();

zauważ, że obejmie to widok paska akcji, twój widok znajduje się poniżej widoku paska akcji


W Activityklasie nie ma takiej metody .
onelaview

window.decorView lub window.decorView jako ViewGroup - jeśli chcesz rzucić go na ViewGroup
Edgar Khimich

0

Dla tych z was, którzy korzystają z Biblioteki wiązania danych , aby uzyskać źródło bieżącej aktywności, wystarczy użyć:

View rootView = dataBinding.getRoot();

A dla użytkowników Kotlin jest to jeszcze prostsze:

val rootView = dataBinding.root

0

Kolejne rozwiązanie rozszerzenia Kotlin

Jeśli widok twojej aktywności jest zadeklarowany w xml (ex activity_root.xml), otwórz xml i przypisz identyfikator do widoku głównego:

android:id="@+id/root_activity"

Teraz w swojej klasie zaimportuj widok, używając:

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

Możesz teraz używać root_activityjako widoku.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.