我改进了android studio的导航抽屉活动项目模板,它使用工具栏v7.app.actionBarDrawerToggle和NavigationView,而不是NavigationDrawerFragment(和layout/fragment_navigation_drawer.xml)。
根据Google's guidancereference设置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上重写一个方法时,选择前者应该是错误的。

07-24 09:36