¿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 () )?

teoREtik
fuente

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()
ernest
fuente
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 ...

papachan
fuente
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();
Mike Jones
fuente
¿Cómo es que esto no tiene más aprobación? ¡Funciona genial!
aeskreis
1
@aeskreis porque en mi caso devuelve nulocurrentFocus?.let { ... }
user924
10

Tal vez quieras intentarlo View.getRootView().

Will Tate
fuente
5

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

Chris
fuente
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))
Hitesh Sahu
fuente
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.

sergeytch
fuente
-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.

Alejandro Tellez
fuente
2
¿Cómo responde esto a la pregunta?
Onik