Obtener vista raíz de la actividad actual

634

Sé cómo obtener la vista raíz con View.getRootView () . También puedo obtener la vista del onClickevento de un botón donde el argumento es una Vista . Pero, ¿cómo puedo obtener la vista en una actividad ?

Lalith
fuente
3
En la actividad, normalmente le dice qué recurso debe representar usando setContentView()y la vista que proporcionó ya es la raíz. Si necesita el control de esa vista, simplemente coloque una ID en XAML y findViewById()estaría bien.
xandy
Mi plan es adjuntar el código dinámicamente ... así que si mis usuarios usan la API, espero que detecte automáticamente las cosas ... ¡La solución de Boulder funciona!
Lalith
44
@xandy: un ligero error tipográfico: XAML -> XML.
superjos

Respuestas:

1048

Si necesita una vista raíz de su actividad (para que pueda agregar sus contenidos allí) use

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

También se informó que en algunos dispositivos hay que usar

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

en lugar.

Tenga en cuenta que, como Booger informó, esto puede estar detrás de la barra de navegación (con el botón Atrás, etc.) en algunos dispositivos (pero parece que en la mayoría de los dispositivos no lo está).

Si necesita obtener la vista que agregó a su actividad utilizando el setContentView()método, como escribió Pottedmeat, puede usar

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

Pero mejor solo configure la identificación para esta vista en su diseño xml y use esta identificación en su lugar.

Dmitry Ryadnenko
fuente
194
En realidad, solo findViewById (android.R.id.content) me está dando la vista raíz. Si eso no es cierto en algunos casos, puedo obtener una vista raíz desde findViewById (android.R.id.content) .getRootView (). Gracias por la respuesta. ¿Dónde puedo obtener más información sobre Android.R? No estaba al tanto de eso.
Lalith
44
Puede verificar aquí, supongo que developer.android.com/reference/android/R.html Es solo una referencia de recursos de Android. Personalmente, aprendí sobre android.R.id.content y luego revisé los diseños en Jerarquía.
Dmitry Ryadnenko
14
Me di cuenta de que esta vista parece incluir la barra de estado, por lo que si está buscando la parte visible de su actividad, use la respuesta de @pottedmeat.
Ben Clayton
55
@Lalith, ¿puede explicar cuándo necesitaba hacer findViewById (android.R.id.content) .getRootView ()? Sería realmente útil saber una regla general.
Batbrat
2
@batbrat Necesito usar .getRootView () en Android 5.0+ cuando uso la barra de acción
Morten Holmgaard
264

Esto es lo que uso para obtener la vista raíz como se encuentra en el archivo XML asignado con setContentView:

final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);
carne en maceta
fuente
33
Esta respuesta dio la vista sin la barra de estado, que es lo que quería. Estaba buscando el ancho de píxel + altura de la parte visible de la actividad. Este funciona, gracias!
Ben Clayton
99
Esto excluye ActionBar!
Wayne
44
¿Hay alguna manera de incluir ActionBartambién?
theblang
3
Las palabras clave aquí son "la vista raíz como se encuentra en el archivo XML". Gracias.
Kacy
3
Esta debería ser la respuesta correcta marcada. Esto colocará el Snackbar dentro de su Actividad (en la raíz), que es donde debería estar (estoy bastante seguro de que nadie quiere colocar su información detrás de los Botones de navegación)
Booger
136

Probé esto en Android 4.0.3, solo:

getWindow().getDecorView().getRootView()

dar la misma vista de lo que obtenemos

anyview.getRootView();

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

y

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

dando hijo de su

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

Por favor confirmar.

Sudar Nimalan
fuente
55
Android2.3.3 parece igual
ruX
2
Funciona en 4.3 Es la forma más fácil y la menor cantidad de código que he encontrado.
Oliver Dixon
10
Mejor si estás usando SnackBar
zackygaurav
getWindow (). getDecorView (). getRootView (). getHeight () devuelve la altura de visualización.
vovahost
3
getWindow (). getDecorView (). getRootView () no se recomienda para snack bar, se superpondrá a la barra de navegación del sistema, findViewById (android.R.id.content) será mejor.
thanhbinh84
31

Obtener vista raíz de la actividad actual.

Dentro de nuestra actividad podemos obtener la rootvista con:

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

o

View rootView = getWindow().getDecorView().getRootView();
Jorgesys
fuente
20

En Kotlin podemos hacerlo un poco más cortos:

val rootView = window.decorView.rootView
Artem Botnev
fuente
19

Por si acaso Alguien necesita una forma más fácil:

El siguiente código ofrece una vista de toda la actividad:

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

Para obtener una vista certian en la actividad, por ejemplo, una imageView dentro de la actividad, simplemente agregue la identificación de esa vista que desea obtener:

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

Espero que esto ayude a alguien

Salah Klein
fuente
55
Puede llamar findViewById(R.id.imageView1);a la actividad si desea la vista específica.
RobCo
3

anyview.getRootView(); Será la forma más fácil.

Khemraj
fuente
2

Solución de extensión Kotlin

Use esto para simplificar el acceso en una Actividad. Luego puede referirse directamente rootViewdesde la Actividad, o activity.rootViewfuera de ella:

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

Si desea agregar lo mismo para Fragmentos por consistencia, agregue:

val Fragment.rootView get() = view?.rootView
Gibolt
fuente
1

para ver la actividad actual

en cualquier onClick obtendremos "Ver vista", al usar 'ver' obtener el rootView.

Ver view = view.getRootView ();

y para obtener Ver en fragmento

Ver vista = FragmentClass.getView ();

user3509903
fuente
0

Si está en una actividad, suponga que solo hay una vista raíz, puede obtenerla así.

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

entonces puedes lanzarlo a tu clase real

o podrías usar

getWindow().getDecorView();

observe que esto incluirá la vista de la barra de acción, su vista está debajo de la vista de la barra de acción

arquero han
fuente
No existe tal método en Activityclase.
onelaview
window.decorView o window.decorView como ViewGroup - si necesita enviarlo al ViewGroup
Edgar Khimich
0

Para aquellos de ustedes que están utilizando la Biblioteca de enlace de datos , para obtener la raíz de la actividad actual, simplemente use:

View rootView = dataBinding.getRoot();

Y para los usuarios de Kotlin, es aún más simple:

val rootView = dataBinding.root
Alex Mamo
fuente
0

Otra solución de Kotlin Extension

Si la vista de su actividad se declara en xml (ex activity_root.xml), abra el xml y asigne una identificación a la vista raíz:

android:id="@+id/root_activity"

Ahora en su clase, importe la vista usando:

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

Ahora puede usar root_activitycomo vista.

smac89
fuente