单击工具栏上的汉堡图标不会打开导航抽屉

我有一个简单的android.support.v7.widget.Toolbar ,我想要做的就是按左上角的“汉堡包”图标打开一个NavigationDrawer。 “hamburger”按钮是可见的,当我从左侧开始拉动时,我看到按钮上的animation,但按下按钮不会像我期望的那样打开/关闭NavigationDrawer。 我已经按照[Google文档] [1]进行操作,但仍无法解决这个问题。 很抱歉任何混淆,下面是我目前正在尝试使用的简化代码:

 public class MainActivity extends AppCompatActivity implements View.OnClickListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("NICK", "button button button.................."); } }); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer); NavigationView n = (NavigationView) findViewById(R.id.nav); mDrawerLayout.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { Log.d("NICK", "button button button.................."); } }); //mDrawerLayout.setDrawerListener(mDrawerToggle); n.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { switch (menuItem.getItemId()) { ////....... } mDrawerLayout.closeDrawers(); // CLOSE DRAWER return true; } }); @Override public boolean onOptionsItemSelected(MenuItem item) { Log.d("NICK","CWECNEWKVNERIPNVIEWNFVIPEWNVIPEWNVPIEWNVPIEWNVPIEWNVPIRWNVPRWVPO"); switch (item.getItemId()) { case android.R.id.home: mDrawerLayout.openDrawer(GravityCompat.START); // OPEN DRAWER Log.d("NICK","CWECNEWKVNERIPNVIEWNFVIPEWNVIPEWNVPIEWNVPIEWNVPIEWNVPIRWNVPRWVPO"); return true; } return super.onOptionsItemSelected(item); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.drawer, menu); return true; } } 

}

因为它是我在运行时没有得到任何日志调试语句。

这基本上是我的问题: https : //stackoverflow.com/a/26636045/1489990 。 我跟着这个,它只是不起作用。

我的理解是,当按下汉堡包图标时调用setNavigationOnClickListener ,这是我关注的地方我的努力是让事件处理得当,因为当我按下按钮时我没有得到我的日志声明。 如果这个想法不正确,请告诉我。 https://developer.android.com/reference/android/widget/Toolbar.html#setNavigationOnClickListener(android.view.View.OnClickListener)

我的布局:

ActivityMain.xml

      

Drawer.xml

                            

Solutions Collecting From Web of "单击工具栏上的汉堡图标不会打开导航抽屉"

看到我对类似post的回答 。

基本上,如果您不需要其他东西(如回调),只需跳过ActionBarDrawerToggle 。 您可以删除所有代码,只需实现打开/关闭抽屉行为,如下所示:

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: mDrawerLayout.openDrawer(GravityCompat.START); // OPEN DRAWER return true; .... } return super.onOptionsItemSelected(item); } 

无论您是否使用NavigationView,上面的代码段都有效。 如果您使用的是导航视图,请在NavigationView中单击侦听器:

 navigationView.setNavigationItemSelectedListener( new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { // Handle menu item clicks here. drawerLayout.closeDrawers(); // CLOSE DRAWER return true; } }); 

更新:

此外,请确保您的活动正在扩展AppCompatActivity (而不是ActionBarActivity )。 有关详细信息,请参阅我的答案 。

UPDATE2:

我调试了你修改过的代码。 尝试这个。 它现在应该工作。 阅读我的内联评论,看看我改变了什么以及为什么:

 import android.os.Bundle; import android.support.design.widget.NavigationView; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends AppCompatActivity { // View.OnClickListener, // GoogleApiClient.ConnectionCallbacks, // GoogleApiClient.OnConnectionFailedListener { DrawerLayout mDrawerLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar); setSupportActionBar(toolbar); // You were missing this setHomeAsUpIndicator getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu); getSupportActionBar().setDisplayHomeAsUpEnabled(true); // I removed your toolbar and drawer click listeners. // They're not needed to open drawer. // The drawer opens from onOptionsItemSelected(). mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer); NavigationView n = (NavigationView) findViewById(R.id.nav); n.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { switch (menuItem.getItemId()) { ////....... } mDrawerLayout.closeDrawers(); // CLOSE DRAWER return true; } }); } @Override public boolean onOptionsItemSelected(MenuItem item) { Log.d("NICK", "CWECNEWKVNERIPNVIEWNFVIPEWNVIPEWNVPIEWNVPIEWNVPIEWNVPIRWNVPRWVPO"); switch (item.getItemId()) { // THIS IS YOUR DRAWER/HAMBURGER BUTTON case android.R.id.home: mDrawerLayout.openDrawer(GravityCompat.START); // OPEN DRAWER Log.d("NICK", "CWECNEWKVNERIPNVIEWNFVIPEWNVIPEWNVPIEWNVPIEWNVPIEWNVPIRWNVPRWVPO"); return true; } return super.onOptionsItemSelected(item); } } // I also removed your onConfigurationChanged(). // It's not needed since you're no longer using ActionBarDrawerToggle. 

Update3:问题与布局有关

查看ActivityMain.xml,我看到你的工具栏在DrawerLayout之外。 你不能这样做。 工具栏需要是DrawerLayout的子项 ,以便工具栏find适当的上下文。

您需要将DrawerLayout作为活动的根。 这是文档 ,具体引用是:

要添加导航抽屉,请使用DrawerLayout对象声明用户界面作为布局的根视图。 在DrawerLayout内,添加一个包含屏幕主要内容的视图(隐藏抽屉时的主要布局)和另一个包含导航抽屉内容的视图。

所以基本上,将ActivityMain.xml更改为如下所示:

        

希望这能解决你的问题。

您需要同步抽屉切换:

 @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Sync the toggle state after onRestoreInstanceState has occurred. mDrawerToggle.syncState(); } 

编辑:该代码适用于我(从您的post复制)

 public class TempActivity extends AppCompatActivity { private ActionBarDrawerToggle mDrawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.temp); setupDrawer(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig); } @Override public boolean onOptionsItemSelected(final MenuItem item) { if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } return super.onOptionsItemSelected(item); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); mDrawerToggle.syncState(); } private void setupDrawer() { Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.my_drawer_layout); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,toolbar,R.string.drawer_open, R.string.drawer_close) { public void onDrawerClosed(View view) { super.onDrawerClosed(view); invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } }; mDrawerLayout.setDrawerListener(mDrawerToggle); } }          

但是如果你使用新的NavigationView ,那么你不需要切换等。 这是一个很好的例子如何使用它。

对于抽屉切换,您需要将“display home as up”设置为false: getSupportActionBar().setDisplayHomeAsUpEnabled(false);

由于我对您的问题没有具体的答案,我想建议一种完全不同的方法:

在我的项目中使用Mike Penz开发的Material Drawer 。 它的外观非常好,易于实现,并且您不必担心。

因此,如果您无法find问题的解决方案,您可以尝试一下。

使用ActionBarDrawerToggle并实现public boolean onOptionsItemSelected(MenuItem item)

工具栏不必在DrawerLayout中,它不可能是这个问题的原因。 toggle.onOptionsItemSelected(item)查找所选项目的ID,如果是android.R.id.home则切换抽屉的可见性。 因此,工具栏或任何创建Home MenuItem的视图都可以放置在布局中的任何位置。

在您的活动中:

 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); } 

只需在活动选项菜单管理function上调用ActionBarDrawerToggle类的函数onOptionsItemSelected(MenuItem menuItem),如下所示。

 mDrawerToggle= new ActionBarDrawerToggle(activity, drawerLayout, R.string.nav_drawer_accessbility_drawer_open, R.string.nav_drawer_accessbility_drawer_close); @Override public boolean onOptionsItemSelected(final android.view.MenuItem item) { navigation().getOptionsMenuInflater(this).closeSearchView(); // The action bar home/up action should open or close the drawer. // ActionBarDrawerToggle will take care of this behavior. mDrawerToggle.onOptionsItemSelected(item); return super.onOptionsItemSelected(item); } 

要么

覆盖onOptionsItemSelected活动,如下所示

 public boolean onOptionsItemSelected(MenuItem item) { if (item != null && item.getItemId() == android.R.id.home) { toggle(); } return super.onOptionsItemSelected(item); } private void toggle() { if (mDrawerLayout.isDrawerVisible(GravityCompat.START)) { mDrawerLayout.closeDrawer(GravityCompat.START); } else { mDrawerLayout.openDrawer(GravityCompat.START); } } 

覆盖onOptionsItemSelected方法并在下面使用

 if(item.getItemId() == android.R.id.home){ // use android.R.id mDrawerLayout.openDrawer(Gravity.LEFT); } 

如果它对某人有帮助,对我来说也是如此,因为调用setSupportActionBar(toolbar)两次的愚蠢错误。 只需在onCreate方法中调用一次,再也不要。 我的错误是我后来用另一种方法调用它。

虽然这里接受的答案可行但是正如他们所说的“预防胜于治疗”。添加mDrawerToggle.syncState(); inPostCreate和onConfigurationChanged()在上面的@mbmc中回答得更好:

 @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); }