MaTTo
MaTTo

Reputation: 2396

How to go back to previous fragment from activity?

I've got an app with nav drawer, which is switching fragments. From inside one of those fragments, I am calling a new activity. When I click back in this activity (in toolbar), I want to go back to previous selected fragment but instead it puts me back to first fragment. I am adding my fragment to back stack so this should not be a problem.

Here is what I have already tried:

I have overriden the onBackPressed method in my 2nd activity like this:

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() == 0) {
        this.finish();
    } else {
        getFragmentManager().popBackStack();
    }
}

It is not working. I also saved index of current fragment inside onsaveinstancestate method and retrieve it but same result. I also tried with always putting current fragment inside variable and try to reshow it but still, it does not work. Anything else I could try?

Fun fact: if I press back inside bottom panel, it does actually goes back to previous fragment.

EDIT: Here is my code for doing this:

 private void replaceFragment(Fragment fragment)
 {
     if (fragment != null)
     {
         FragmentManager manager = getSupportFragmentManager();
         manager.beginTransaction()
                    .replace(R.id.main_content, fragment)
                    .addToBackStack(null)
                    .commit();
        }
    }

I add first fragment only, if savedInstanceState is null, like so:

if (savedInstanceState == null) {
    // first time
    mTitle = getResources().getString(R.string.home);
    replaceFragment(HomeFragment.newInstance()); 
}

And yes, all this is done inside onCreate() method.

Upvotes: 17

Views: 29339

Answers (9)

Abdul Muqeet
Abdul Muqeet

Reputation: 128

getSupportFragmentManager().beginTransaction()
                           .setReorderingAllowed(true)
                           .addToBackStack("home") // should not be null
                           .replace(binding.fragmentContainer.getId(), new HomeFragment())
                           .commit();

Pass name in addToBackStack(String name) method. This function add fragment into backstack if passed name is not null. App automatically start managing backstack of fragment

Remove your override onBackPressed() method. No use of it now

Upvotes: 0

Arjun Vyas
Arjun Vyas

Reputation: 27

When you call new Activity from Fragment you should write :

Intent intent = new Intent(getFragment().getContext(),NewActivity.class);
getFragment().getContext().startActivity(intent);

FragmentManager fm = CurrentFragment.getActivity().getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.addToBackStack(CurrentFragment.class.getName()).commit();
fm.executePendingTransactions();

It Works for me.

Upvotes: 0

Parinda Rajapaksha
Parinda Rajapaksha

Reputation: 3109

Override onOptionsItemSelected method in activity as follows,

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == android.R.id.home) {
        finish();
    }
    return super.onOptionsItemSelected(item);
}

Upvotes: 0

MaTTo
MaTTo

Reputation: 2396

I see, that people are still trying to help me. This answer helped me fix my problem: Android - Navigation Up from Activity to Fragment

Upvotes: 0

user4836191
user4836191

Reputation:

When you call an activity from other activity's fragment, then the previous activity's instance state that is the calling activity which was having fragment's instance state will be saved in stack...so all u need to do is finish the called activity and u will have the fragment from which you called your second activity.

@Override
public void onBackPressed() {
finish();
}

Upvotes: 3

L.L.
L.L.

Reputation: 679

I had the same problem and got fixed. The only thing you need to do is to override the method "onOptionsItemSelected" in the activity:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
        finish();
        return true;
    }
    return super.onOptionsItemSelected(item);
}

android.R.id.home is your first fragment in the menu.

Upvotes: 7

EpicPandaForce
EpicPandaForce

Reputation: 81539

What I tend to do is this

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() == 0) {
        this.finish();
    } else {
        super.onBackPressed(); //replaced
    }
}

This way it handles the fragment stuff on its own within, but when there's no fragments left to go back to, then it finishes the activity.

EDIT: UP navigation can recreate your previous activity even if it already exists. To prevent that from happening, redefine the Up navigation's event in onOptionsItemSelected like so:

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            Intent parentIntent = NavUtils.getParentActivityIntent(this);
            if(parentIntent == null) { 
                finish();
                return true;
            } else {
                parentIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                startActivity(parentIntent);
                finish();
                return true;
            }
    }
    return super.onOptionsItemSelected(item);
}

Upvotes: 4

Chris Fox
Chris Fox

Reputation: 76

Sorry, I don't have enough reputation to leave a comment. So I have to guess. I once had the same issue. Sounds like a problem related to the activity lifecycle (http://developer.android.com/reference/android/app/Activity.html#ProcessLifecycle). Be sure to add your first fragment only once, because your activity's fragment manager is capable of the lifecycle. Thus, the statement that adds the first fragment to your fragment manager should be surrounded by if (savedInstanceState == null) { ... }.

Upvotes: 0

Samrat Dutta
Samrat Dutta

Reputation: 1737

Try

getFragmentManager().popBackStackImmediate();

It worked for me.

Upvotes: 1

Related Questions