Switching between Android Navigation Drawer image and Up caret when using fragments Switching between Android Navigation Drawer image and Up caret when using fragments android android

Switching between Android Navigation Drawer image and Up caret when using fragments


It's easy as 1-2-3.

If you want to achieve:

1) Drawer Indicator - when no fragments are in the Back Stack or the Drawer is opened

2) Arrow - when some Fragments are in the Back Stack

private FragmentManager.OnBackStackChangedListener        mOnBackStackChangedListener = new FragmentManager.OnBackStackChangedListener() {    @Override    public void onBackStackChanged() {        syncActionBarArrowState();    }};@Overrideprotected void onCreate(Bundle savedInstanceState) {    getSupportActionBar().setDisplayShowHomeEnabled(true);    getSupportActionBar().setDisplayHomeAsUpEnabled(true);    mDrawerToggle = new ActionBarDrawerToggle(            this,                         mDrawerLayout,              R.drawable.ic_navigation_drawer,             0,             0      ) {        public void onDrawerClosed(View view) {            syncActionBarArrowState();        }        public void onDrawerOpened(View drawerView) {            mDrawerToggle.setDrawerIndicatorEnabled(true);        }    };    mDrawerLayout.setDrawerListener(mDrawerToggle);    getSupportFragmentManager().addOnBackStackChangedListener(mOnBackStackChangedListener);}@Overrideprotected void onDestroy() {    getSupportFragmentManager().removeOnBackStackChangedListener(mOnBackStackChangedListener);    super.onDestroy();}private void syncActionBarArrowState() {    int backStackEntryCount =         getSupportFragmentManager().getBackStackEntryCount();    mDrawerToggle.setDrawerIndicatorEnabled(backStackEntryCount == 0);}

3) Both indicators to act according to their shape

@Overridepublic boolean onOptionsItemSelected(MenuItem item) {    if (mDrawerToggle.isDrawerIndicatorEnabled() &&         mDrawerToggle.onOptionsItemSelected(item)) {        return true;    } else if (item.getItemId() == android.R.id.home &&                getSupportFragmentManager().popBackStackImmediate()) {        return true;    } else {        return super.onOptionsItemSelected(item);    }}

P.S. See Creating a Navigation Drawer on Android Developers on other tips about the 3-lines indicator behavior.


You have written that, to implement lower-level fragments, you are replacing the existing fragment, as opposed to implementing the lower-level fragment in a new activity.

I would think that you would then have to implement the back functionality manually: when the user pressed back you have code that pops the stack (e.g. in Activity::onBackPressed override). So, wherever you do that, you can reverse the setDrawerIndicatorEnabled.


I've used next thing:

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {            @Override            public void onBackStackChanged() {                if(getSupportFragmentManager().getBackStackEntryCount() > 0){                    mDrawerToggle.setDrawerIndicatorEnabled(false);                    getSupportActionBar().setDisplayHomeAsUpEnabled(true);                }                else {                    getSupportActionBar().setDisplayHomeAsUpEnabled(false);                    mDrawerToggle.setDrawerIndicatorEnabled(true);                }            }        });