2011-03-11 26 views
16

¿Puedes poner fragmentos dentro del fragmento para una pestaña en la barra de acciones?Fragmentos en fragmentos de la pestaña Barra de acciones?

Tengo una aplicación Android (3.0/Honeycomb) con una actividad principal que tiene una barra de acción con 3 pestañas. Las pestañas se agregan en el método onCreate() de mi actividad y los fragmentos de pestañas se agregan/eliminan con un TabListener. El código es casi idéntico a la muestra en http://developer.android.com/guide/topics/ui/actionbar.html#Tabs.

El TabListener se parece a esto:

public class SwapOutTabListener implements ActionBar.TabListener { 
    public SwapOutTabListener(Fragment fragment) { 
     _fragment = fragment; 
    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     ft.add(R.id.fragment_container, _fragment, null); 
    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     ft.remove(_fragment); 
    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     // do nothing 
    } 

    private Fragment _fragment; 
} 

Dos de mis pestañas son fragmentos simples, que sólo contienen una sola TextView en ellos, algo como esto (la mayoría de los atributos eliminadas para mayor claridad):

<LinearLayout> 
    <TextView android:text="Tab 1" /> 
</LinearLayout> 

Pero el fragmento de una de mis pestañas es más complicado, y contiene dos fragmentos incrustados, un poco como esta:

<LinearLayout> 
    <fragment 
     android:name="...Fragment_1" 
     android:id="@+id/frag1" 
    /> 
    <fragment 
     android:name="...Fragment_2" 
     android:id="@+id/frag2" 
    /> 
</LinearLayout> 

Cuando el usuario selecciona la pestaña para este fragmento, todos los métodos del ciclo de vida de arranque (onStart(), onResume()) son llamados para los tres fragmentos (el fragmento de la pestaña, más los dos fragmentos incrustados).

Pero cuando el usuario selecciona otra pestaña, solo el fragmento de la pestaña obtiene cualquiera de los métodos de fin de ciclo de vida (onPause(), onStop(), etc.). Los dos fragmentos incrustados nunca reciben ninguna de estas llamadas y nunca se cierran.

Esto causa problemas cuando se-seleccionado de nuevo la pestaña, ya que el tiempo de ejecución se queja de un identificador de fragmento duplicado al cargar el fragmento de pestaña:

Binary XML file line #7: Duplicate id 0x7f05000a, tag null, or parent id 0x7f050009 with another fragment for ...Fragment_1 

¿Es mi responsabilidad para eliminar estos fragmentos incrustados cuando el fragmento pestaña ¿es removido? Si es así, ¿cuándo, exactamente, hago eso?

+0

Podría publicar su código TabListener que realiza el interruptor pestaña? También están las líneas duplicadas 'android: id =" @ + id/frag2 "' por encima de intencionadas o solo un error de transcripción en la pregunta publicada aquí? – adamp

+0

@adamp, sí, el ID duplicado era un error de transcripción ... Edité la pregunta para corregir eso. También agregué mi código TabListener a la pregunta. –

Respuesta

18

No, los fragmentos no están actualmente en una jerarquía. Consideré hacer esto, pero en este momento todos los casos de uso han sido impulsados ​​principalmente por un uso excesivo excesivo de fragmentos en los que cada elemento de IU se implementa como un fragmento. No es así como están destinados a ser utilizados, están destinados a encapsular las principales piezas de nivel superior de una aplicación. Si tienes una jerarquía de cosas, para eso son tu diseño y tus vistas.

+0

Aquí hay un caso de uso a considerar. Tome la aplicación Google I/O 2012, instálela en una tableta de 10 pulgadas. Ir a la vista de sesiones. Tienes "Sesiones" y "Sandbox" como pestañas en la parte superior, pero no creo que puedas usar PageViewer aquí porque ya tienes fragmentos. Creo que sería bueno usar PageViewer y aún así poder usar Fragmentos para la pestaña en la que se encuentra actualmente. – Justin

Cuestiones relacionadas