I am currently building an application for Android (14 <= SDK <= 21) by using one ActionBarActivity
and more Fragments
, such as ListFragment
and MapFragment
, which are swapped within a single FrameLayout
view.
The ActionBarActivity automatically replace/commit fragment A. Then, when the user tap a button, the hosting Activity replace/commit a new different fragment B. My goal is to let the user go back on fragment A as soon as she presses the back button.
Some code now.
MainActivity
public class MainActivity extends ActionBarActivity implements StopFragment.OnFragmentInteractionListener,
StopItemFragment.OnFragmentInteractionListener {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragmentManager = getFragmentManager();
fragmentManager.enableDebugLogging(true);
...
if (fragmentManager.findFragmentById(R.id.content_frame) == null) {
StopItemFragment list = StopItemFragment.newInstance(null); //A - extends ListFragment
fragmentManager.beginTransaction()
.replace(R.id.content_frame, list)
.addToBackStack(null)
.commit();
}
...
@Override
public void onFragmentInteraction(String id) {
selectItem(Integer.parseInt(id));
}
private void selectItem(int position) {
StopFragment fragment = StopFragment.newInstance(null, null); //B - extends Fragment
...
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment)
.commit();
...
}
}
Problem
Even if addToBackStack()
is called, when I am on fragment B, I am not able to go back to fragment A. MainActivity is directly closed.
Yet I tried to manage the back stack by myself with no luck. I can see that the fragment is on the stack but if I call popBackStackImmediate()
, fragment A is popped out and the fragment transaction is not performed. (first back press nothing happen, second activity closed)
I attach also the FragmentManager logcat:
http://pastebin.com/hFLHprL8
If you are Struggling with addToBackStack() & popBackStack() then simply use
In your Activity In OnBackPressed() find out fargment by tag and then do your stuff
For more Information https://github.com/DattaHujare/NavigationDrawer I never use addToBackStack() for handling fragment.
the reason why the
popBackStack()
andpopBackStackImmediatly()
is due to the fact that you didnt add that fragment (that you want to pop) to the backStack. In order to do this you have to make a call to addToBackStack() at the moment of making the transaction to add/replace your fragment.Try this (Note add not replace for fragmentA, and addToBackStack() for fragmentB)
and
For those, who are still looking for solution.
In the main
Activity
class (which is hosting the fragments)just overrideonBackPressed()
.There is no
onBackPressed()
method in fragment, and this method is just for theactivity
. So,when we press the back key, the default behaviour ofactivity
is shown, which isNow we need to override this method to tell the
activity
that when we press the back key, if there are any fragments in back stack, pop them out (and this is when theaddToBackStack()
comes into picture). Otherwise follow the default behaviour.I had to call
beginTransaction()
andcommit()
ofFragmentManager
manually.Solved by overriding
onBackPressed()
: