Cramps
Cramps

Reputation: 464

Android ActionBar Up button won't open navigation drawer

I've been trying to make my Navigation Drawer open using the ActionBarActivity's Up button for a few hours now, but I just can't seem to work it out.

Right now, I can open it by swiping/sliding right and I can see the arrow Up/Back button in the ActionBar, but the Navigation Drawer won't open once I tap the button.

Please note I'm using Support v7 ActionBarDrawerToggle.

Here's my ActionBarActivity's onCreate:

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

    if (savedInstanceState == null) {
        getFragmentManager().beginTransaction()
                .add(R.id.container, new HomeFragment())
                .commit();
    }

    Log.d(TAG, "onCreate");

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);
    mDrawerLayout = (DrawerLayout) findViewById(R.id.main_drawer_layout);
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open, R.string.drawer_close);
    mDrawerLayout.setDrawerListener(mDrawerToggle);
    mDrawerToggle.setDrawerIndicatorEnabled(true);
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    Log.d(TAG, "onPostCreate");
    mDrawerToggle.syncState();
}

Am I missing something? Perhaps there's a method call that links the ActionBar's Up/Back button to the DrawerToggle?

Any help/guidance is very well appreciated.

Update: I also tried using mDrawerToggle.syncState(); and nothing changed. Updated the onCreate method above to include the syncState call.

Update 2: I updated the code again to how it currently stands in my MainActivity file. I made a few changes as suggested but the drawer still won't open.

I've tested this in two devices: in an HTC One m7 with Android 5.0.2 and Sense 6.5 and in an x86 AVD Emulator running Lollipop SDK 21.

Upvotes: 1

Views: 2882

Answers (4)

inmyth
inmyth

Reputation: 9050

I think you should add

mDrawerToggle.setDrawerIndicatorEnabled(true);

and move this line mDrawerLayout.setDrawerListener(mDrawerToggle); after mDrawerToggle = new ActionBarDrawerToggle(...);

Edit: After I checked my code again, the closing and opening is handled in separate method

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        if(mDrawerLayout.isDrawerOpen(drawerList)) {
            mDrawerLayout.closeDrawer(drawerList);
        }
        else {
            mDrawerLayout.openDrawer(drawerList);
        }
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

Upvotes: 0

SilentKnight
SilentKnight

Reputation: 14011

Take a look at my codes first:

public class HomeActivity extends ActionBarActivity implements
    DrawerCloseListener {
private Toolbar toolbar;
private DrawerLayout drawer;
private ActionBarDrawerToggle drawerToggle;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    toolbar = (Toolbar) findViewById(R.id.home_toolbar);
    toolbar.setNavigationIcon(R.drawable.icon_nav);
    setSupportActionBar(toolbar);
    drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawerToggle = new ActionBarDrawerToggle(this, drawer, toolbar,
            R.string.app_name, R.string.app_name);
    drawerToggle.setHomeAsUpIndicator(R.drawable.icon_nav);
    drawer.setDrawerListener(drawerToggle);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (drawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    return super.onOptionsItemSelected(item);
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    // TODO Auto-generated method stub
    super.onConfigurationChanged(newConfig);
    drawerToggle.onConfigurationChanged(newConfig);
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onPostCreate(savedInstanceState);
    drawerToggle.syncState();
}

@Override
public void onBackPressed() {
    // TODO Auto-generated method stub
    if (drawer.isDrawerOpen(Gravity.LEFT | Gravity.START)) {
        drawer.closeDrawers();
        return;
    }
    super.onBackPressed();
}

@Override
public void onDrawerClose() {
    // TODO Auto-generated method stub
    if (drawer.isDrawerOpen(Gravity.LEFT | Gravity.START)) {
        drawer.closeDrawers();
    }
}
}

And among codes above, I replaced ActionBar by ToolBar, but you still can use ActionBar where there is a ToolBar. Did you miss something?

Upvotes: 4

Kushal
Kushal

Reputation: 8478

You need to change order of two lines :

1.

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open, R.string.drawer_close);

then 2.

 mDrawerLayout.setDrawerListener(mDrawerToggle);

Because while setting setDrawerListener the object mDrawerToggle was not initialized

Hope this will solve your work

Upvotes: 0

Charles Durham
Charles Durham

Reputation: 2495

You need to sync your drawer toggle in order to get the up button to well ... sync :)

mDrawerToggle.syncState();

Upvotes: 0

Related Questions