android.R.id.content como contenedor para Fragment

Mi situación es la Actividad A que contiene el Fragmento B. Siempre lo implemento así.

Diseño de la actividad A:

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" /> 

Disposición para el fragmento B:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_title" android:layout_centerInParent="true" android:background="@drawable/green_button" android:textColor="@android:color/white"/> </RelativeLayout> 

Esto funciona muy bien, pero si abrimos el monitor del dispositivo Android y miramos la jerarquía de vista:

Por lo tanto, no me gusta que en mi jerarquía hay dos mismos FrameLayouts inútil y puedo cortar mi R.id.container. Lo hago así:

onCreate (Bundle args) en mi Actividad A:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getFragmentManager().beginTransaction() .add(android.R.id.content, FragmentB.newInstance()).commit(); } 

Simplemente no establezco contenido para mi Actividad y adjunto mi Fragmento B al contenedor del sistema android.R.id.content. Esto funciona muy bien para mí. Quité una inclusión inútil.

Mi pregunta es que es buena práctica hacer esto "hack". ¿Podría bloquear mi aplicación en cualquier caso y qué problemas podría tener después de esta implementación? Puede ser que alguien tenga experiencia útil en esta pregunta?

Gracias a todos por buenas respuestas.

no tiene nada de malo. Como usted dijo: usted no necesita su disposición adicional de R.id.content tan … apenas no la agrega con setContentView. Incluso se menciona en la documentación oficial de ActionBar: http://developer.android.com/guide/topics/ui/actionbar.html#Tabs

De forma alternativa, si el contenido de la pestaña llena el diseño de la actividad, entonces su actividad no necesita un diseño en absoluto (ni siquiera necesita llamar a setContentView). En su lugar, puede colocar cada fragmento en la vista raíz predeterminada, a la que puede hacer referencia con el ID de contenido android.R.id.content

Si desarrollas solo para 14+ (debido a ActionBar nativo) todo debería estar bien con él, pero si usas lib de soporte, por favor lee los siguientes puntos.

I. Si utiliza la revisión de la Biblioteca de soporte inferior a 19:

Lo importante es: ¿Cuál es su nivel mínimo de API para el que se desarrolla?

Si su API de soporte de aplicaciones <14 y utiliza AppCompat debe tener en cuenta el comportamiento diferente. android.R.id.content es la parte de la pantalla donde su aplicación debe mostrar su contenido. En la API nativa 14+ Esto es sólo parte de ActionBar, ya que se supone que esta parte muestra el contenido de la actividad.

En AppCompat, donde no hay soporte nativo para ActionBar. android.R.id.content es el contenedor de toda la pantalla de la aplicación. Esto significa – incluyendo ActionBar, porque ActionBar se emula allí y se agrega como una jerarquía de vista estándar. Para solucionar este problema, debes comprobar si estás en API inferior a 14 y usar un id diferente: R.id.action_bar_activity_content

Puede crear un método auxiliar para obtener el ID correcto:

 public static int getContentViewId() { return Build.VERSION.SDK_INT>=Build.VERSION_CODES.ICE_CREAM_SANDWICH ? android.R.id.content : R.id.action_bar_activity_content; } 

Así que si usted está desarrollando para 14 + esta solución es perfectamente bien. Si utiliza la implementación personalizada de ActionBar (como AppCompat) tiene que hacer este truco.


II. Si utiliza la revisión 19 de la Biblioteca de soporte técnico (o superior):

Parece que este comportamiento se corrigió en la revisión 19 de la biblioteca de soporte técnico: https://code.google.com/p/android/issues/detail?id=58108#c21

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4.2_r1/android/support/v7/app/ActionBarActivityDelegateBase.java/#228

Usted puede ver que están reemplazando el antiguo R.id.action_bar_activity_content con android.R.id.content estándar (y el antiguo android.R.id.content con NO_ID) para una mejor compatibilidad! Por lo tanto, si utilizas Support Lib r19 o superior (o simplemente un framework nativo) puedes simplemente android.R.id.content en <14 y 14+ variantes 🙂

  • Fragmento Transacción cargar la vista vacía, pero el fragmento se muestra después de que el dispositivo giratorio
  • ¿Cómo se manejan las transacciones de fragmentos cuando el estado de la actividad principal está destinado a ser guardado?
  • Android TextInputLayouts perder texto / contenido al volver en la transacción de fragmentos
  • ¿Cómo reemplazar el fragmento C con el fragmento A cuando se pulsa el botón Atrás?
  • Ciclo de vida del fragmento - ¿Qué método se llama mostrar / ocultar?
  • Android - Hacer traducciones y objectAnimator en el mismo archivo XML
  • ¿Cómo funciona el nuevo FragmentTransaction commitNow () trabajando internamente?
  • Congelación de la interfaz de usuario cuando la transacción de fragmentos
  • Android: ¿Cuándo es apropiado utilizar FragmentTransaction.remove?
  • Salir de la animación no funciona; FragmentTransaction animación personalizada no funciona para ocultar
  • La biblioteca de la barra de acciones de AppCompat no muestra fragmentos añadidos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.