Reputation: 21452
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
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
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
Reputation: 18978
to change title of tool bar whenever change fragment you have to do below way.
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