显示箭头而不是 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 项目模板,它使用Toolbar、v7.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有两种类型:
- Activity's onPostCreate 有两个参数。
- AppCompatActivity's onPostCreate 有一个参数。
当您在 Android Studio 上重写方法时,您应该错误地选择了前者。
我改进了Android Studio 的Navigation Drawer Activity 项目模板,它使用Toolbar、v7.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有两种类型:
- Activity's onPostCreate 有两个参数。
- AppCompatActivity's onPostCreate 有一个参数。
当您在 Android Studio 上重写方法时,您应该错误地选择了前者。