Ottieni la vista radice dall'attività corrente


634

So come ottenere la vista principale con View.getRootView () . Sono anche in grado di ottenere la vista onClickdall'evento di un pulsante in cui l'argomento è una vista . Ma come posso ottenere la vista in un'attività ?


3
Nell'attività, in genere si indica quale risorsa deve essere visualizzata utilizzando setContentView()e la vista fornita è già la radice. Se hai bisogno dell'handle di quella vista, inserisci semplicemente un ID in XAML e findViewById()andrebbe bene.
Xandy,

Il mio piano è quello di collegare il codice in modo dinamico .. quindi se i miei utenti usano l'API mi aspetto che rilevi automaticamente le cose .. La soluzione di Boulder funziona!
Lalith,

4
@xandy: un piccolo errore di battitura: XAML -> XML.
Superjos

Risposte:


1048

Se hai bisogno di una vista radice della tua attività (così puoi aggiungere i tuoi contenuti lì) usa

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

Inoltre è stato segnalato che su alcuni dispositivi è necessario utilizzare

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

anziché.

Si noti che, come riportato da Booger, questo potrebbe essere dietro la barra di navigazione (con il pulsante indietro ecc.) Su alcuni dispositivi (ma sembra che sulla maggior parte dei dispositivi non lo sia).

Se hai bisogno di vedere che hai aggiunto alla tua attività usando il setContentView()metodo, allora come ha scritto la carne in vaso puoi usare

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

Ma meglio impostare id su questa vista nel layout XML e utilizzare invece questo id.


194
In realtà solo findViewById (android.R.id.content) mi sta dando la vista di root. Se ciò non è vero in alcuni casi, posso ottenere la vista radice da findViewById (android.R.id.content) .getRootView (). Grazie per la risposta. Dove posso saperne di più sulle cose di android.R? Non ne ero a conoscenza.
Lalith,

4
Puoi controllare qui suppongo developer.android.com/reference/android/R.html È solo un riferimento alle risorse Android. Personalmente ho imparato a conoscere android.R.id.content e poi a controllare i layout in hierarchyviewer.
Dmitry Ryadnenko il

14
Ho notato che questa vista sembra includere la barra di stato, quindi se stai cercando la parte visibile della tua attività, usa la risposta di @pottedmeat.
Ben Clayton,

5
@Lalith, puoi approfondire quando è necessario trovare findViewById (android.R.id.content) .getRootView ()? Una regola generale sarebbe davvero utile da sapere.
Batbrat,

2
@batbrat Ho bisogno di usare .getRootView () in Android 5.0+ quando uso la barra delle azioni
Morten Holmgaard

264

Questo è quello che uso per ottenere la vista radice come si trova nel file XML assegnato con setContentView:

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

33
Questa risposta ha dato la vista senza la barra di stato - che è quello che volevo. Stavo cercando la larghezza dei pixel + l'altezza della parte visibile dell'attività. Questo funziona, grazie!
Ben Clayton,

9
Questo esclude ActionBar!
Wayne,

4
C'è un modo per includere ActionBaranche quello?
theblang,

3
Le parole chiave qui sono "la vista radice come si trova nel file XML". Grazie.
Kacy,

3
Questa dovrebbe essere la risposta contrassegnata corretta. Questo posizionerà lo Snackbar all'interno della tua attività (alla radice), che è dove dovrebbe essere (sono abbastanza sicuro che nessuno vuole mettere le loro informazioni dietro i pulsanti di navigazione)
Booger,

136

Ho provato questo in Android 4.0.3, solo:

getWindow().getDecorView().getRootView()

dare la stessa visione da cosa otteniamo

anyview.getRootView();

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

e

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

dando il suo figlio

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

Si prega di confermare


5
Android2.3.3 sembra lo stesso
ruX il

2
Funziona in 4.3 È il modo più semplice e la minima quantità di codice che ho trovato.
Oliver Dixon,

10
Meglio se stai usando
SnackBar

getWindow (). getDecorView (). getRootView (). getHeight () restituisce l'altezza di visualizzazione.
vovahost,

3
getWindow (). getDecorView (). getRootView () non è raccomandato per lo snack bar, si sovrapporrà alla barra di navigazione del sistema, findViewById (android.R.id.content) sarà migliore.
Thanhbinh84,

31

Ottieni la vista radice dall'attività corrente.

All'interno della nostra attività possiamo ottenere la rootvista con:

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

o

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

20

In Kotlin possiamo farlo un po 'più breve:

val rootView = window.decorView.rootView

19

Solo in caso Qualcuno ha bisogno di un modo più semplice:

Il codice seguente offre una vista dell'intera attività:

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

Per ottenere una vista certian nell'attività, ad esempio una visualizzazione immagine all'interno dell'attività, è sufficiente aggiungere l'id di quella vista che si desidera ottenere:

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

Spero che questo aiuti qualcuno


5
Puoi semplicemente chiamare findViewById(R.id.imageView1);l'attività se desideri la vista specifica.
RobCo

3

anyview.getRootView(); sarà il modo più semplice.


2

Soluzione di estensione Kotlin

Usalo per semplificare l'accesso in un'attività. Quindi puoi fare direttamente riferimento rootViewall'Attività o activity.rootViewal di fuori di essa:

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

Se desideri aggiungere lo stesso per Frammenti per coerenza, aggiungi:

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

1

per visualizzare la vista dell'attività corrente

in qualsiasi onClick avremo "View view", usando 'view' ottieni il rootView.

Visualizza view = view.getRootView ();

e per visualizzare View in framment

Visualizza view = FragmentClass.getView ();


0

se sei in un'attività, supponi che ci sia una sola vista radice, puoi ottenerla in questo modo.

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

puoi quindi lanciarlo nella tua vera classe

o potresti usare

getWindow().getDecorView();

nota che questo includerà la vista della barra delle azioni, la tua vista è sotto la vista della barra delle azioni


Non esiste un metodo simile in Activityclasse.
onelaview

window.decorView o window.decorView come ViewGroup - se è necessario eseguirne il cast nel ViewGroup
Edgar Khimich,

0

Per quelli di voi che utilizzano la libreria di associazione dei dati , per ottenere la radice dell'attività corrente, utilizzare semplicemente:

View rootView = dataBinding.getRoot();

E per gli utenti di Kotlin, è ancora più semplice:

val rootView = dataBinding.root

0

Un'altra soluzione di estensione Kotlin

Se la vista della tua attività è dichiarata in xml (ex activity_root.xml), apri l'xml e assegna un id alla vista radice:

android:id="@+id/root_activity"

Ora nella tua classe, importa la vista usando:

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

Ora puoi usare root_activitycome vista.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.