why cant my fragments be added to back stack?
@Override
public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
FragmentTransaction
The only problem in your code is that you 'correctly' create a transaction, but then you never use it. The supplied transaction FragmentTransaction ft
cannot be added to the backstack because it is not supported by the listener, however this should work:
@Override
public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
ListFragment newListFragment = new ListFragment();
Fragment newFragment = new EntryFrag();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.frameOne, newListFragment);
transaction.replace(R.id.frameTwo, newFragment);
transaction.addToBackStack(null);
transaction.commit();
}
Note the use of transaction.replace(...
vice ft.replace(...
also you must commit()
this yourself, as you properly did, because TabListener will only auto-commit FragmentTransaction ft
Also, you can read about adding to the back stack not being supported in the TabListener API docs here: http://developer.android.com/reference/android/app/ActionBar.TabListener.html
You are using Action Bar tabs and you want the Fragments bound to the tabs to be added to the back stack, usually that is forbidden (and it is understandable inmost cases). Action Bar Tabs are not allowed to be added to the Back Stack. If your application is tab based it is ok, but if you display tabs only in particular situations and in others you hide them this behavior is not good (and I do not understand why Google does not let it).....maybe you need the first tab to be added to the back stack (my situation), but in such a case onTabSelected will not allow you to add the transaction to the back stack, it will throw an exception because the addToBackStack is blocked inside this method call (there is the method disallowAddToBackStack inside FragmentTransaction that does exactly that...I totally disagree with that constraint).
Im not getting why you are instantiating a new FragmentTransaction inside your function, just use the one passed as a parameter. I didnt test this, but im pretty sure that it should work.
@Override
public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
ListFragment newListFragment = new bListFragment();
Fragment newFragment = new EntryFrag();
ft.replace(R.id.frameOne, newListFragment);
ft.replace(R.id.frameTwo, newFragment);
ft.addToBackStack(null);
ft.commit();
}
Get rid of your transaction
and, instead, use the FragmentTransaction
provided in the callback. There's no need to instantiate a new FragmentTransaction
when one is already handed to you. Pass in whatever you want into your call to ft.addToBackstack();
and then call ft.commit();