Android支持工具栏+ ActionBarDrawerToggle不更改为箭头

我正在努力工作的工具栏和抽屉。 我正在尝试将汉堡切换为箭头,当我向后台堆叠添加新片段时却无法做到这一点。

也许我错过了一些东西,但我找不到办法。 有人有同样的问题吗?

这是声明:

mDrawerToggle = new ActionBarDrawerToggle( getActivityCompat(), /* host Activity */ mDrawerLayout, /* DrawerLayout object */ ((BaseActivity) getActivityCompat()).getToolbar(), R.string.navigation_drawer_open, /* "open drawer" description for accessibility */ R.string.navigation_drawer_close /* "close drawer" description for accessibility */ ) 

这是我将一个片段添加到后栈时调用的函数

 public void setToggleState(boolean isEnabled) { if (mDrawerLayout == null) return; if (isEnabled) { mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); mDrawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_UNLOCKED); } else { mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); mDrawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); } mDrawerToggle.syncState(); } 

我想你要做的就是删除第三个参数。 从而:

 mDrawerToggle = new ActionBarDrawerToggle( getActivityCompat(), /* host Activity */ mDrawerLayout, /* DrawerLayout object */ // ((BaseActivity) getActivityCompat()).getToolbar(), <== delete this argument R.string.navigation_drawer_open, /* "open drawer" description for accessibility */ R.string.navigation_drawer_close /* "close drawer" description for accessibility */ ); 

愿它有所帮助。

我有同样的问题。 我的解决方案是:

确保您的活动实现onBackStackChangedListener。 在你的活动’onCreate中我设置了backstack监听器并设置了工具栏

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mFm = getFragmentManager(); mFm.addOnBackStackChangedListener(this); // Setup toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar); mToolbar.setVisibility(View.VISIBLE); setSupportActionBar(mToolbar); // Setup drawer toggle mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerlayout); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.menu_open, R.string.menu_close); mDrawerLayout.setDrawerListener(mDrawerToggle); getSupportActionBar().setHomeButtonEnabled(true); mDrawerToggle.syncState(); // Setup initial fragment if (savedInstanceState == null) { mCurrentFragment = DashboardFragment.newInstance(); mFm.beginTransaction().add(CONTAINER_ID, mCurrentFragment).commit(); } } 

还记得设置:

 @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); mDrawerToggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig); } 

现在魔术发生在onBackStackChanged()上。 将最顶层片段的setDrawerIndicatorEnabled设置为true,将该片段设置为setDisplayHomeAsUpEnabled为false。 反向其他的。 我还必须调用syncState,否则汉堡包不会再出现:

 @Override public void onBackStackChanged() { mDrawerToggle.setDrawerIndicatorEnabled(mFm.getBackStackEntryCount() == 0); getSupportActionBar().setDisplayHomeAsUpEnabled(mFm.getBackStackEntryCount() > 0); mDrawerToggle.syncState(); } 

我使用以下布局实现了它:我使用了ActionBarDrawerToggle v7 Drawer.xml

          

toolbar.xml

    

Drawer.java

package com.example.toolbar;

 import android.content.res.Configuration; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.widget.Toolbar; import android.view.Gravity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; public class Drawer extends ActionBarActivity { ActionBarDrawerToggle mDrawerToggle; private String[] days; ArrayAdapter adapter; private ListView mDrawerList; DrawerLayout mDrawerLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.drawer); days = new String[] { "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" }; adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, days); mDrawerList = (ListView) findViewById(R.id.drawerList); mDrawerList.setAdapter(adapter); mDrawerList.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { // TODO Auto-generated method stub Fragment fragment = new MyFragment(); Bundle args = new Bundle(); args.putString(MyFragment.ARG_PLANET_NUMBER, days[position]); // args.putInt(MyFragment.ARG_PLANET_NUMBER, position); fragment.setArguments(args); FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.mainContent, fragment).commit(); } }); Toolbar toolbar = (Toolbar) findViewById(R.id.tool1); setSupportActionBar(toolbar); toolbar.setTitle("ToolBar Demo"); toolbar.setLogo(R.drawable.ic_launcher); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.open_navigation_drawer, R.string.close_navigation_drawer) { @Override public void onDrawerSlide(View drawerView, float slideOffset) { // TODO Auto-generated method stub super.onDrawerSlide(drawerView, slideOffset); } /** Called when a drawer has settled in a completely closed state. */ @Override public void onDrawerClosed(View view) { super.onDrawerClosed(view); getSupportActionBar().setTitle("hello"); } /** Called when a drawer has settled in a completely open state. */ @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); getSupportActionBar().setTitle("hi"); } }; mDrawerLayout.setDrawerListener(mDrawerToggle); // getSupportActionBar().setDisplayHomeAsUpEnabled(true); //<---- added // getSupportActionBar().setHomeButtonEnabled(true); //<---- added } @Override public boolean onOptionsItemSelected(MenuItem item) { // <---- added if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } return super.onOptionsItemSelected(item); } @Override protected void onPostCreate(Bundle savedInstanceState) { // <---- added super.onPostCreate(savedInstanceState); mDrawerToggle.syncState(); // important statetment for drawer to // identify // its state } @Override public void onConfigurationChanged(Configuration newConfig) { // <---- added super.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig); } @Override public void onBackPressed() { if (mDrawerLayout.isDrawerOpen(Gravity.START | Gravity.LEFT)) { // <---- // added mDrawerLayout.closeDrawers(); return; } super.onBackPressed(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } 

对于大多数情况,@ hata的回答是正确的。

但实际上,使用工具栏作为ActionBarDrawerToggle(...)构造函数的参数并没有错。

当然,如果你使用库存Toolbar AppCompatActivity提供的那个,比如库存Theme.AppCompat.Light根主题,就没有任何意义。 即使您想在布局中使用自定义Toolbar ,例如,如果您正在实现Material Design的工具栏下状态栏导航抽屉模式,您仍然可以调用setSupportActionBar(toolbar)并仍然不会将工具栏传递给ActionBarDrawerToggle()活动处理导航图标。

但是如果你真的想将你的ActionBarDrawerToggle绑定到一个不是活动的动作栏的Toolbar栏,并且可能有不同的样式和不同的图标或者其他什么 – 还有一段路要走。

问题是,当你没有将工具栏作为第四个parameter passing时,活动应该提供导航图标(箭头) – 而AppCompatActivity返回homeAsUpIndicator属性的值 – 它在任何一个标准的AppCompat中定义主题。

但是,当您明确地传递ToolbarActionBarDrawerToggle期望工具栏实例提供可绘制的导航指示器 – 但它没有,因为即使您像这样应用适当的样式:

  

由于某种原因(可能它甚至是一个错误), Widget.AppCompat.Toolbar样式没有navigationIcon属性,因此当ActionBarDrawerToggle要求导航图标时, Toolbar返回null 。 因此,为了解决这个问题,您只需从样式派生并添加属性:

    

现在,您可以使用工具栏感知构造函数ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, 0, 0)并且仍然具有导航图标。

此行确保汉堡包图标在点击时更改为箭头。 确保在代码中写入此内容。

 mDrawerLayout.setDrawerListener(mDrawerToggle);