Modification de l'utilisation de fragments ActionBar
-
26-10-2019 - |
Question
Dans un fragment, appelé dans une activité j'afficher une liste de lignes de bus comme ceci:
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:
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.
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.
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.