La commutation de fragments à l'intérieur de l'onglet
Je suis en création d'une application qui utilise ActionBarSherlock. L'application se compose de trois onglets, et dans chacun d'eux, de multiples écrans sont présentés consécutivement en fonction de l'entrée utilisateur. Je suis capable de passer des Fragments entre les onglets, mais la commutation de fragments dans onglets donne un problème. Je l'ai essayé comme ceci:
Dans la classe principale:
SingleStationFragment singleStationFragment = new SingleStationFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(android.R.id.content, singleStationFragment);
transaction.addToBackStack(null);
transaction.commit();
Ce ne remplacer le premier fragment de la deuxième, mais quand j'ai changer les onglets, le deuxième fragment est encore visible, montrant le contenu de l'onglet nouveau par-dessus le contenu de l'onglet ancien. Je pense que de toute façon je besoin de détacher le deuxième fragment dans onTabUnselected
, mais je n'ai aucune idée de comment faire pour obtenir une référence à ce Fragment.
Quelqu'un peut-il m'aider?
Pour plus de clarté, certaines grandes catégories:
Ma classe principale:
public class TreinVerkeer extends SherlockFragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupTabs(savedInstanceState);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
private void setupTabs(Bundle savedInstanceState) {
ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
Tab tab = actionBar.newTab().setText("STATIONS").setTabListener(new TabListener<StationsFragment>(this, "stations", StationsFragment.class));
actionBar.addTab(tab);
tab = actionBar.newTab().setText("ROUTE").setTabListener(new TabListener<RouteFragment>(this, "route", RouteFragment.class));
actionBar.addTab(tab);
tab = actionBar.newTab().setText("DELAYS").setTabListener(new TabListener<DelaysFragment>(this, "delays", DelaysFragment.class));
actionBar.addTab(tab);
if (savedInstanceState != null) {
actionBar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("tab", getSupportActionBar().getSelectedNavigationIndex());
}
}
La TabListener (à partir de "L'ajout de la Navigation Onglets" sur le site des développeurs Android avec quelques modifications mineures):
public class TabListener<T extends SherlockFragment> implements com.actionbarsherlock.app.ActionBar.TabListener {
private SherlockFragment mFragment;
private final Activity mActivity;
private final String mTag;
private final Class<T> mClass;
/**
* Constructor used each time a new tab is created.
*
* @param activity
* The host Activity, used to instantiate the fragment
* @param tag
* The identifier tag for the fragment
* @param clz
* The fragment's Class, used to instantiate the fragment
*/
public TabListener(Activity activity, String tag, Class<T> clz) {
mActivity = activity;
mTag = tag;
mClass = clz;
}
/* The following are each of the ActionBar.TabListener callbacks */
public void onTabSelected(Tab tab, FragmentTransaction ft) {
SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag);
//Check if the fragment is already initialized
if (mFragment == null && preInitializedFragment == null) {
//If not, instantiate and add it to the activity
mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName());
ft.add(android.R.id.content, mFragment, mTag);
} else if (mFragment != null) {
//If it exists, simply attach it in order to show it
ft.attach(mFragment);
} else if (preInitializedFragment != null) {
ft.attach(preInitializedFragment);
mFragment = preInitializedFragment;
}
}
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
if (mFragment != null) {
//Detach the fragment, because another one is being attached
ft.detach(mFragment);
}
}
public void onTabReselected(Tab tab, FragmentTransaction ft) {
//User selected the already selected tab. Usually do nothing.
}
}
Et StationsFragment
(RouteFragment
et DelaysFragment
sont les mêmes, avec seulement un texte différent)
public class StationsFragment extends SherlockFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.stationsfragment, container, false);
}
}
Vous devez vous connecter pour publier un commentaire.
Donc ce qui s'est passé est que, dans
TabListener
, dans leonTabUnselected
méthode, laFragment
était pas détachée, causant encore être montrer alors qu'un nouveauFragment
a été montré.La cause de cela était, que les
Fragment
qui a été détaché a été le premier fragment, et non mon deuxième fragment. J'ai fait quelques modifications.Dans le
Activity
:Ici, j'ai ajouté le
"STATIONS"
balise dans lereplace()
méthode, qui est la même étiquette que le premier fragment.Le
TabListener
est maintenant comme suit:Dans le
onTabUnselected
méthode que j'ai maintenant, tout d'abord récupérer le bonFragment
, puis le détacher.Espère que cela aide quelqu'un!