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 ?

Lalith
źródło
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.

Dmitrij Ryadnenko
źródło
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);
mięso doniczkowe
źródło
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ć.

Sudar Nimalan
źródło
5
Android 2.3.3
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();
Jorgesys
źródło
20

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

val rootView = window.decorView.rootView
Artem Botnev
źródło
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

Salah Klein
źródło
5
Możesz po prostu wywołać findViewById(R.id.imageView1);aktywność, jeśli chcesz mieć konkretny widok.
RobCo
3

anyview.getRootView(); będzie najłatwiejszym sposobem.

Khemraj
źródło
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
Gibolt
źródło
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 ();

użytkownik3509903
źródło
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

Bowman Han
źródło
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
Alex Mamo
źródło
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.

smac89
źródło