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 ?


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.


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);

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.


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();

20

En Kotlin podemos hacerlo un poco más cortos:

val rootView = window.decorView.rootView

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


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


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

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 ();


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


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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.