Question

Dans un fragment, appelé dans une activité j'afficher une liste de lignes de bus comme ceci:

Page 1, lors de l'ouverture pour la première fois.

Ensuite, une fois que l'utilisateur clique sur « Stations », j'aime afficher une liste des stations bien sûr. J'utilise ce code:

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();
    }
}

Le XML pour cette activité est:

<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 est un simple ListFragment affiché au-dessus de l'autre:

Après avoir cliqué sur le bouton Liste des stations

Ce qui fonctionne bien est bien ActionBar, il contient maintenant correctement le titre que.

Que ne fonctionne pas est si je appuyez sur retour maintenant La liste des stations est cachée, mais l'ancien ActionBar n'est pas rétablie.

ActionBar après le retour de bouton Liste

Les documents disent que la façon d'ajouter l'ActionBar utilise des méthodes onCreateOptionsMenu etc.

Ainsi, LongDistanceFragment (le premier montré), je crée la barre comme ceci:

@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);
}

Mais il est en quelque sorte pas restauré lorsque l'utilisateur est de retour dans ce fragment.

Je pense que d'une façon de récupérer l'état du ActionBar lors du laminage retour Fragment transaction est nécessaire.

Qu'est-ce que je manque? Merci pour toute aide.

Était-ce utile?

La solution

Si je comprends bien votre code correctement, le problème est probablement dans votre StationListFragment.

Le ActionBar est associé à l'activité elle-même, et non pas un fragment particulier à l'intérieur.

Je devine que dans le StationListFragment que vous modifiez ActionBar pour afficher le titre « Stations » et désactiver le mode de navigation Liste. Dans ce cas, en appuyant sur le bouton de retour annule la transaction - éliminer efficacement la StationListFragment - mais n'annule automagiquement les changements que vous avez apportées à la barre d'action de l'activité

.

Qu'est-ce que vous devez faire est prioritaire l'un des gestionnaires de changement d'état au sein de votre station Liste Fragment pour annuler la ActionBar change quand il est retiré / caché.

Une meilleure approche serait d'utiliser une transaction replace pour échanger le LongDistanceFragment avec le StationListFragment (plutôt que d'ajouter ce dernier au-dessus de l'ancien.) Ensuite, vous pouvez ajouter le code pour configurer la barre d'action pour chaque fragment afin qu'ils définis vers le haut de façon appropriée quand ils deviennent visibles (en remplaçant onResume) plutôt que d'essayer de nettoyer après une a été retirée.

Autres conseils

je traitais avec le même problème et quand je reviens à des changements ActionBar dans la méthode onStop du second fragment, il fonctionne très bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top