Clicking hamburger icon on Toolbar does not open Navigation Drawer

后端 未结 13 2784
太阳男子
太阳男子 2020-12-14 00:08

I have a simple android.support.v7.widget.Toolbar and all I am trying to do is to open a NavigationDrawer by pressing the \"hamburger\" icon in the top left cor

相关标签:
13条回答
  • 2020-12-14 00:22

    Use ActionBarDrawerToggle and implement public boolean onOptionsItemSelected(MenuItem item)

    Toolbar DOES NOT have to be within a DrawerLayout, it's not likely to be the cause of this issue. toggle.onOptionsItemSelected(item) looks for the ID of the item selected and if it is android.R.id.home then the drawer's visibility is toggled. Thus Toolbar, or any View that creates a Home MenuItem, can be placed anywhere in your layout.

    Within your activity:

    ActionBarDrawerToggle toggle;
    
    private void setupDrawerToggleInActionBar() {
        // assuming a Toolbar has been initialized in your onCreate
        this.setSupportActionBar(toolbar);
    
        // setup the action bar properties that give us a hamburger menu
        ActionBar actionBar = this.getSupportActionBar();
        if(actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setHomeButtonEnabled(true);
        }
    
        // the toggle allows for the simplest of open/close handling
        toggle = new ActionBarDrawerToggle(this,
                                           drawerLayout,
                                           R.string.navigation_drawer_open,
                                           R.string.navigation_drawer_close);
        // drawerListener must be set before syncState is called
        drawerLayout.setDrawerListener(toggle);
    
        toggle.setDrawerIndicatorEnabled(true);
        toggle.syncState();
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    
        // This is required to make the drawer toggle work
        if(toggle.onOptionsItemSelected(item)) {
            return true;
        }
    
        /*
         * if you have other menu items in your activity/toolbar 
         * handle them here and return true
         */
    
        return super.onOptionsItemSelected(item);
    }
    
    0 讨论(0)
  • 2020-12-14 00:23

    While accepted answer here works alright however, as they say "Prevention is better than cure".. Adding mDrawerToggle.syncState(); in onPostCreate and onConfigurationChanged() wroks much better as answerd by @mbmc above:

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }
    
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }
    
    0 讨论(0)
  • 2020-12-14 00:24

    If it helps somebody, to me it happened the same because of the stupid error of calling setSupportActionBar(toolbar) two times. Just call it once in onCreate method and never again. My mistake was I called it later in another method.

    0 讨论(0)
  • 2020-12-14 00:24

    Idk why...but changing return value to false rather than true fixed the ham Icon for me. on onOptionItemSelected override method

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        super.onOptionsItemSelected(item);
        if(item.getItemId() == R.id.logout){
            ParseUser.logOut();
            Intent intent = new Intent(getApplicationContext(), MainActivity.class);
            startActivity(intent);
            Toast.makeText(this, "Logout Successful!", Toast.LENGTH_SHORT).show();
        } else if(item.getItemId() == R.id.action_settings){
            Toast.makeText(this, "No setting to update! Will be available later...", Toast.LENGTH_SHORT).show();
        }
        return true; // here change this to false
    }
    
    0 讨论(0)
  • 2020-12-14 00:26

    For the drawer toggle you need to set "display home as up" to false: getSupportActionBar().setDisplayHomeAsUpEnabled(false);

    0 讨论(0)
  • 2020-12-14 00:30

    After a lot of different problems I found a way to make it work putting Toolbar Widget inside AppBarLayout.

    Be sure that there is no other layout on top of widget toolbar!

    <androidx.drawerlayout.widget.DrawerLayout 
     xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/drawable_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <com.google.android.material.appbar.AppBarLayout 
             android:layout_width="match_parent"
              android:layout_height="wrap_content"
            android:fitsSystemWindows="true"
            xmlns:android="http://schemas.android.com/apk/res/android">**
    
              <androidx.appcompat.widget.Toolbar 
              xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/main_page_toolbar"
              android:layout_width="match_parent" android:layout_height="wrap_content"
              android:background="@color/colorPrimaryDark"
              android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
    
              </androidx.appcompat.widget.Toolbar>
             </com.google.android.material.appbar.AppBarLayout>**
    
            .... YOUR LAYOUT ...
    
        </RelativeLayout>
    
        <com.google.android.material.navigation.NavigationView
            android:id="@+id/navigation_view"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:layout_marginBottom="3dp"
            app:menu="@menu/navigation_menu">
    
        </com.google.android.material.navigation.NavigationView>
    
    </androidx.drawerlayout.widget.DrawerLayout>
    
    0 讨论(0)
提交回复
热议问题