显示箭头而不是 material 设计版本的汉堡包图标。为什么 onPostCreate 中的 syncState 不起作用?

Arrow is showed instead of the material design version hamburger icon. Why doesn't syncState in onPostCreate work?

我改进了Android Studio 的Navigation Drawer Activity 项目模板,它使用Toolbarv7.app.ActionBarDrawerToggle NavigationView 而不是 NavigationDrawerFragment(和 layout/fragment_navigation_drawer.xml)。

根据Google's guidance and reference,我设置了ActionBarDrawerToggle。我做到了 1) 在 onCreate 中实例化,2) 在 onPostCreate 中调用 syncState 和 3) 调用 onConfigurationChanged 和 onOptionsItemSelected。

除了一件事,它几乎可以完美运行:汉堡包图标显示为箭头

可以在 Whosebug 上找到类似的问题,尤其是 this question。但问题是关于使用旧 R.drawable.ic_drawer 作为汉堡包的方式,这不是 material 设计(5.0 Lollipop 之前)版本。而且这个问题没有答案,提问者评论说他已经解决了,但没有说明任何解决方案。

过了一段时间,无意中找到了解决办法。它有点脏。就是在onCreate中调用syncState。因为似乎出于某种原因,我的应用程序中没有调用 onPostCreate。实际上,这个肮脏的解决方案用于

但是 the official reference 在 onPostCreate 中调用 syncState。为什么它不起作用?为什么我的应用程序不调用 onPostCreate?这应该是不显示汉堡包图标(而是显示箭头)的主要原因。

下面是我的代码:

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

    ...

}

这里是PostCreate:

@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有两种类型:

  1. Activity's onPostCreate 有两个参数。
  2. AppCompatActivity's onPostCreate 有一个参数。

当您在 Android Studio 上重写方法时,您应该错误地选择了前者。