¿Cómo obtener la vista de contenido de Activity?


279

¿Qué método debo llamar para saber si una Actividad tiene su contentView (una vez que se ha llamado al método setContentView () )?

Respuestas:


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

o

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

o

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

44
o getWindow().findViewById(android.R.id.content):)
Alex Lockwood

1
esto funciona bien en lo que respecta a la obtención de la vista principal ... BUt..si intento this.findViewById (android.R.id.content) .setBackgroundDrawable (d); no funciona ... ¿Puede sugerirme? Gracias de antemano
Rajesh Wadhwa

3
Si instala un diseño desde XML usando setContentView(R.layout.my_view), esto devuelve el padre de ese diseño.
Jay Lieske

Hola @ernest, tengo una pregunta de tipo como si en mi diseño tengo una imagen en la parte superior de dos pestañas en la barra de pestañas. y en la parte inferior se abre un menú SatelliteMenu.
Devendra Singh

1
el contenido no existe para Android.Resource.Id.
Justin

23

Puede recuperar la vista si coloca una ID en su diseño.

<RelativeLayout
    android:id="@+id/my_relative_layout_id"

Y llámalo desde findViewById ...


Esta es la forma más sólida de obtener la raíz de un diseño instalado.
Jay Lieske

3
¿A qué pasas findViewById?
trans

1
@trans Ver contentView = findViewById (R.id.my_relative_layout_id);
Justin Liu el

11

Qué tal si

View view = Activity.getCurrentFocus();

¿Cómo es que esto no tiene más aprobación? ¡Funciona genial!
aeskreis

1
@aeskreis porque en mi caso devuelve nulocurrentFocus?.let { ... }
user924


5

También puede anular el onContentChanged()que se activa entre otros cuando setContentView()se ha llamado.


la respuesta de ernest le dará la vista enfocada actual incluso si contiene una vista desplazable
YuDroid

2

Si estas usando Kotlin

    this.findViewById<View>(android.R.id.content)
                         .rootView
                         .setBackgroundColor(ContextCompat.getColor(this, R.color.black))

1

No existe el método "isContentViewSet". Puede poner alguna llamada simulada requestWindowFeature en el bloque try / catch antes de setContentView de esta manera:

tratar {
  requestWindowFeature (Window.FEATURE_CONTEXT_MENU);
  setContentView (...)
} catch (AndroidRuntimeException e) {
  // hacer algo o nada
}

Si la vista de contenido ya estaba configurada, requestWindowFeature arrojará una excepción.


-3

La mejor opción que encontré y la menos intrusiva, es establecer un parámetro de etiqueta en tu xml, como

DISEÑO XML DE TELÉFONO

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:tag="phone"/>

DISEÑO XML DE TABLETA

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:tag="tablet">

    ...

</RelativeLayout>

y luego llame a esto en su clase de actividad:

View viewPager = findViewById(R.id.pager);
Log.d(getClass().getSimpleName(), String.valueOf(viewPager.getTag()));

Espero que funcione para ti.


2
¿Cómo responde esto a la pregunta?
Onik
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.