Mina Fawzy
Mina Fawzy

Reputation: 21452

Android - update toolbar title in activity while handle back navigation with fragment

I have Activity hosted slide menu with fragments , when user click at any item in slidemenu fragment is opened , I need to handle back navigation

when user click at item in list I call this method to display proper fragment

public void SelectItem(int position) {

        Fragment _fragment = null;
        switch (position) {
            case 0:
                _fragment = Test_Home.newInstance();
                break;

            case 1:
                _fragment = Diseases_Fragment.newInstance();
                break;

          ........

            case 8:
                Logout();
                break;

            default:
               break;

        }

        if (_fragment != null) {
            FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction().replace(R.id.view_content, _fragment).addToBackStack(null).commit();
             // set title , this textview in toolbar 
            _frag_title.setText(nav_items[position]);
            mDrawerLayout.closeDrawer(GravityCompat.START);
        }

this method to handle back button

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

my onCreate method

 @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.home_view);
            Toolbar _toolbar = (Toolbar) findViewById(R.id.toolbar);

           setSupportActionBar(_toolbar);
           getSupportActionBar().setHomeButtonEnabled(true);
           getSupportActionBar().setDisplayHomeAsUpEnabled(true);
           _frag_title = (TextView) _toolbar.findViewById(R.id.frag_title);
    }

in fact it work just fine , but my problem is displayed fragment show old title dont show new title

is there way call my method _frag_title.setText(nav_items[position]);

my problem not in back navigation , my problem how to update toolbar title in navigation

Upvotes: 3

Views: 5465

Answers (3)

diyoda_
diyoda_

Reputation: 5420

You have to handle this on resume of each oh your Fragment to specify the title when it comes back to the fragment.

Currently what happens is, you are setting the title in onCreate or somewhere when it actually creates the fragment, But since the tool bar is not something that resides inside Activity (Not in the Fragment) You have to make changes to that specifically. Best place is onResume method of the fragment.

So try setting up the TextView in your onResume of your Fragment

Upvotes: 0

Mina Fawzy
Mina Fawzy

Reputation: 21452

here is a piece of my code after resolve this issue

public void SelectItem(int position) {
        Fragment _fragment = null;
        switch (position) {
            case 0:
                _fragment = Test_Home.newInstance();
                break;

            case 1:
                _fragment = Diseases_Fragment.newInstance();
                break;

          ........
          .....

            case 8:
                Logout();
                break;

            default:
               break;

        }

        if (_fragment != null) {
         // I add tag when I add fragment to BackStack
          String backStackName = fragment.getClass().getName();
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.view_content, fragment, "TARGET_TAG")
                .setTransitionStyle(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
                .addToBackStack(backStackName)
                .commit();
        _frag_title.setText(nav_items[position]);
        mDrawerLayout.closeDrawer(GravityCompat.START);
        } 
       }

I add BackStackChangedListener on onCreate method

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home_view);

        ......
        ....

        .
        getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
            @Override
            public void onBackStackChanged() {
                Fragment f = getSupportFragmentManager().findFragmentById(R.id.view_content);
                if (f != null) {
                    updateTitleAndDrawer(f);
                }
            }
        });
}

   private void updateTitleAndDrawer(Fragment f) {
        String name = f.getClass().getName();
        if (name != null) {
            ChangeTitle(name);
        }
    }
 private void ChangeTitle(String fragmentName) {
        if (fragmentName.equals(Test_Home.class.getName())) {
            _frag_title.setText(nav_items[0]);
        } else if (fragmentName.equals(Diseases_Fragment.class.getName())) {
            _frag_title.setText(nav_items[1]);
        } else if (fragmentName.equals(Questions_Fragment.class.getName())) {
            _frag_title.setText(nav_items[2]);

       .......... 
       .......
}

}

Upvotes: 1

Dhaval Parmar
Dhaval Parmar

Reputation: 18978

to change title of tool bar whenever change fragment you have to do below way.

  1. must have to use fragment with TAG name or by ID, i will show you how to use that using TAG name(you can also use by id in that case you have to change my code).

to use by TAG, you have to add fragment TAG, whenever you add fragment in layout, let's add fragment by TAG

Fragment fragmentA = new FragmentA();
getFragmentManager().beginTransaction()
    .replace(R.id.MainFrameLayout,fragmentA,"YOUR_TARGET_FRAGMENT_TAG")
    .addToBackStack("YOUR_SOURCE_FRAGMENT_TAG").commit(); 

after do above way, in onBackPressed check which fragment on you are, using below code

@Override
public void onBackPressed(){
    FragmentManager fm = getFragmentManager();
    if (fm.getBackStackEntryCount() > 0) {
        Log.i("MainActivity", "popping backstack");
        fm.popBackStack();
        Fragment fragment = getFragmentManager().findFragmentByTag("YOUR_TARGET_FRAGMENT_TAG");
        if (fragment instanceof FragmentA) {
            // add your code to change title of toolbar
        }
    } else {
        Log.i("MainActivity", "nothing on backstack, calling super");
        super.onBackPressed();  
    }
}

Upvotes: 6

Related Questions