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:
- Android: Fragmento de diálogo y problemas de Backstack
- Cómo agregar / quitar Fragmento en el botón haga clic?
- El artículo de DrawerLayout hace clic - ¿Cuándo es el momento adecuado para reemplazar el fragmento?
- No se encontró ninguna vista para id - DialogFragment + Fragment
- FragmentTransacation con diapositiva en / out animación en> 4 rendimiento
<?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.
- Mover fragmento de Android a un contenedor diferente No se puede cambiar el identificador de contenedor de fragmento
- Cómo borrar backStack de soporte FragmentManager?
- Fragmento de Android La transacción con animación provoca que el flash blanco
- ViewPager dentro de Fragmento desaparece después de transaction.remove () (Mantener instancia?)
- Cambiar el orden z de Fragmentos durante la FragmentTransaction en curso
- Se hace clic en un diseño invisible detrás del fragmento:
- ¿Qué hace exactamente FragmentManager y FragmentTransaction exactamente?
- Cómo mostrar el fragmento de entrada sobre el fragmento de salida mientras se anima.
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
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 🙂
- Poner mi aplicación en la lista de búsqueda de Google Now Phone (Búsqueda global de Android)
- Bucle eficiente a través de la lista de Java