我改进了android studio的导航抽屉活动项目模板,它使用工具栏v7.app.actionBarDrawerToggle和NavigationView,而不是NavigationDrawerFragment(和layout/fragment_navigation_drawer.xml)。
根据Google's guidance和reference设置ActionBarDrawerToggle。我让它1)在oncreate中实例化,2)在onpostreate中调用syncstate,3)调用onconfigurationchanged和onoptionsitemselected。
它几乎是完美的工作,除了一件事:汉堡图标显示为箭头。
stackoverflow上也有类似的问题,特别是this question时。但问题是如何使用旧的r.drawable.ic_抽屉作为汉堡包,这不是材料设计(5.0棒棒糖之前)版本。此外,这个问题没有答案,提问者评论说他已经解决了,但没有说明任何解决办法。
过了一会儿,我意外地找到了解决办法。有点脏。在oncreate中调用syncstate。因为似乎出于某种原因,我的应用程序中没有调用onpostreate。实际上,这种肮脏的溶液用于an answer to the other problem。
但是the official reference说在onpostreate中调用syncstate。为什么不起作用?为什么我的应用程序不在创建后调用?这应该是没有显示汉堡包图标(而是显示箭头)的主要原因。
以下是我的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
...
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerToggle = new ActionBarDrawerToggle(
this,
drawerLayout,
R.string.navigation_drawer_open,
R.string.navigation_drawer_close
) {
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}
};
drawerLayout.setDrawerListener(drawerToggle);
navigationView = (NavigationView) findViewById(R.id.navigation_view);
navigationView.setNavigationItemSelectedListener(this);
drawerToggle.syncState(); // calling this here is somewhat a dirty solution
}
@Override
public void onPostCreate(Bundle savedInstanceState,
PersistableBundle persistentState) {
super.onPostCreate(savedInstanceState, persistentState);
drawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
drawerToggle.onConfigurationChanged(newConfig);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggle.onOptionsItemSelected(item)) {
return true;
}
...
}
最佳答案
后处理:
@Override
public void onPostCreate(Bundle savedInstanceState,
PersistableBundle persistentState) {
super.onPostCreate(savedInstanceState, persistentState);
drawerToggle.syncState();
}
应该是这样的:
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
drawerToggle.syncState();
}
有两种类型的onpostcreate:
Activity's onPostCreate有两个参数。
AppCompatActivity's onPostCreate只有一个参数。
当你在android studio上重写一个方法时,选择前者应该是错误的。