coder
coder

Reputation: 13248

Backstack android fragment navigation

This is how I used navigation drawer to display Fragments:

private void displayView(int position) {
            // update the main content by replacing fragments
            Fragment fragment = null;
            switch (position) {
            case 0:
                fragment = new Fragment0();
                break;
            case 1:
                fragment = new Fragment1();
                break;
            case 2:
                fragment = new Fragment2();
                break;
            case 3:
                fragment = new Fragment3();
                break;
            case 4:
                fragment = new Fragment4();
                break;
            case 5:
                fragment = new Fragment5();

                }

            default:
                break;
            }

            if (fragment != null) {
                FragmentManager fragmentManager = getFragmentManager();
                fragmentManager.beginTransaction()
                        .replace(R.id.frame_container, fragment)
                        .addToBackStack(null)
                        .commit();

                // update selected item and title, then close the drawer
                mDrawerList.setItemChecked(position, true);
                mDrawerList.setSelection(position);
                setTitle(navMenuTitles[position]);
                mDrawerLayout.closeDrawer(drawerll);
            } else {
                // error in creating fragment
                Log.e("MainActivity", "Error in creating fragment");
            }
        }

Suppose if the user navigates to Fragment 2-> Fragment 5-> Fragment3.

If the user clicks the back button I need to have the descending order and on each fragment I am displaying the name of the Fragment when he goes to that particular fragment ie:

Fragment 3-> Fragment 5-> Fragment2.

This is what I have tried:

First Method:

FragmentManager fm = getSupportFragmentManager();
int count = fm.getBackStackEntryCount();
for(int i = 0; i < count; ++i) {
    fm.popBackStackImmediate();
}

Second Method:

fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

I'm unable to get this working**(ie.. I'm unable to move it back to the fragment where I have come from**) and unable to display the name of the fragment based on the backstack

Any help is greatly appreciated.

Upvotes: 4

Views: 3040

Answers (4)

droid kid
droid kid

Reputation: 7609

Your navigation is working fine I guess and the issue you are facing is the tittle for which you can use

public class SampleFragment extends Fragment{

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

                // Creating view correspoding to the fragment
        View v = inflater.inflate(R.layout.fragment_layout, container, false);

        // Updating the action bar title
        getActivity().getActionBar().setTitle("Screen name");


        return v;
    }
}

in every fragment. And whenever you backpress the onCreateView method of fragmemt(the one which is poping from the backstack) gets called and the tittle will again set replacing the old tittle.

Upvotes: 1

SweetWisher ツ
SweetWisher ツ

Reputation: 7306

1. Handle back

You can use getSupportFragmentManager().popBackStack() method in onBackPressed:

@Override
public void onBackPressed() {
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
         getSupportFragmentManager().popBackStack();
         getSupportFragmentManager().beginTransaction().commit();
    }
    else {
        super.onBackPressed();
    }
}

Don't forget to add the fragment in BackStack like :

transaction.addToBackStack(null);

2. Display Name

To show the current fragment name in actionbar, you can get it on onResume of your Fragment :

@Override
protected void onResume() {
    super.onResume();

    ((FrgmentActivtiyName)getActivity).changeTitle("title");
}

Define a method which set the title in the actionbar in your FrgmentActivity:

public void changeTitle(String titleToSet) {
   // set title as titleToSet
}

Hope it helps ツ

Upvotes: 1

Bhargav Jhaveri
Bhargav Jhaveri

Reputation: 2183

Please try this:

In the activity which holds the fragments, override the onbackPressed() method by,

@Override
public void onBackPressed() {
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
         getSupportFragmentManager().popBackStack();
         getSupportFragmentManager().beginTransaction().commit();
    }
    else {
        super.onBackPressed();
    }
}

Upvotes: 0

Jai Rajesh
Jai Rajesh

Reputation: 939

if (fragment != null) {

        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.frame_container, fragment).commit();
        menuList.setItemChecked(position, true);
        menuList.setSelection(position);
    }

Upvotes: -1

Related Questions