2011-10-19 17 views
9

En un fragmento, denominado dentro de una actividad que estoy mostrando una lista de líneas de autobús así:Cambio de la Barra de acciones cuando se utilizan fragmentos

Page 1, when opening for the first time.

Entonces, una vez que el usuario hace clic en "estaciones", que me gustan para mostrar una lista de estaciones, por supuesto. Estoy usando este código:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.act_long_distance); 

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.add(R.id.f_long_distance, new LongDistanceFragment()).commit(); 
} 

@SuppressWarnings({"UnusedDeclaration"}) 
public void showStationList(View view) { 
    String tag = (String) view.getTag(); 
    if (tag != null && tag.length() > 0) { 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     StationListFragment fragment = new StationListFragment(tag.split(",")); 
     ft.add(R.id.f_long_distance, fragment); 
     // ft.replace(R.id.f_long_distance, fragment); 
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
     ft.addToBackStack(null); 
     ft.commit(); 
    } 
} 

El XML para esta actividad es:

<LinearLayout 
    android:id="@+id/ll_container" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    > 
    <FrameLayout 
     android:id="@+id/f_long_distance" 
     android:layout_weight="1" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 
</LinearLayout> 

StationListFragment es un simple ListFragment que aparece en la parte superior de la otra:

After clicking on the Station List button

Lo que funciona bien es la barra de acciones, ahora contiene correctamente el título solamente.

Lo que no funciona es si presiono ahora. la lista de estaciones está oculto, pero el viejo no se restaura la Barra de acciones:

ActionBar after coming back from List button

Los documentos están diciendo que la forma de añadir la Barra de acciones está utilizando métodos onCreateOptionsMenu etc.

Así, en LongDistanceFragment (la primera se muestra una), estoy creando la barra de la siguiente manera:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    Log.d(TAG, "onViewCreated"); 
    super.onViewCreated(view, savedInstanceState); 

    setHasOptionsMenu(true); 
} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 

    ActionBar bar = getSupportActivity().getSupportActionBar(); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
    bar.setListNavigationCallbacks(new SimpleSpinnerArrayAdapter(getActivity()), this); 
} 

Pero de alguna manera no se restablece una vez que el usuario está de vuelta en ese fragmento.

Creo que es necesario recuperar el estado de la barra de acciones al revertir la transacción de fragmentos.

¿Qué me estoy perdiendo? Gracias por cualquier ayuda.

+0

Estoy batallando con esto en este momento también. Aquí hay una pregunta relacionada. http://stackoverflow.com/questions/6503189/fragments-onresume-from-back-stack –

Respuesta

9

Si entiendo su código correctamente, el problema es probable dentro de su StationListFragment.

La Barra de acciones está asociada a la Actividad en sí, no a un Fragmento particular dentro de ella.

Supongo que dentro de StationListFragment está modificando la barra de acciones para mostrar el título "Estaciones" y deshabilitar el modo de navegación de lista. En ese caso, al presionar el botón Atrás se deshace la transacción, eliminando de manera efectiva el Filo de la Lista de la Biblioteca, pero no se deshacen de manera automática los cambios que haya realizado en la Barra de Acción de la Actividad.

Lo que tendrá que hacer es anular uno de los controladores de cambio de estado dentro de su Fragmento de lista de estaciones para deshacer los cambios de la barra de acciones cuando se elimine/oculte.

Un mejor enfoque sería utilizar una transacción replace para intercambiar la LongDistanceFragment con el StationListFragment (en lugar de incorporación de estos últimos en la parte superior de la primera.) A continuación, puede agregar el código para configurar la barra de acción a cada fragmento para que configúrelo adecuadamente cuando se vuelvan visibles (anulando onResume) en lugar de intentar limpiarlo después de que uno lo haya eliminado.

+2

Ninguno de los controladores de cambio de estado en el ListFragment se llama en realidad, por lo que no tiene forma de hacerlo. Eso es una falta en la API. –

+1

Estoy usando reemplazar, pero estoy agregando la vista de detalles a la pila posterior. Y luego, cuando se presiona el botón Atrás, no se dispara ningún evento en la lista para poder restablecer el título. –

+0

Entonces, ¿dónde está cambiando el título de ActionBar? Basado en el código de esta muestra, nunca debería mostrar "paradas de línea de bus". Tengo que suponer que eso está sucediendo en el fragmento StationListFragment. –

1

Estaba lidiando con el mismo problema y cuando cambio los cambios a ActionBar en el método onStop del segundo Fragmento, funciona bien.

Cuestiones relacionadas