Стрелка отображается вместо иконки дизайна гамбургера. Почему не работает syncState в onPostCreate?
Я доработал шаблон проекта "Навигационный ящик" в Android Studio, который использует панель инструментов v7.app.ActionBarDrawerToggle и NavigationView вместо NavigationDrawerFragment (и layout /gment_navigation_drawer.xml).
В соответствии с рекомендациями и рекомендациями Google, я настроил ActionBarDrawerToggle. Я сделал это 1) создание экземпляра в onCreate, 2) вызов syncState в onPostCreate и 3) вызов через onConfigurationChanged и onOptionsItemSelected.
Он почти идеально работает, за исключением одного: значок гамбургера показан в виде стрелки.
Подобная проблема может быть найдена на StackOverFlow, особенно для этого вопроса. Но вопрос в том, как использовать старый R.drawable.ic_drawer в качестве гамбургера, который не является версией дизайна материала (до версии 5.0 Lollipop). Более того, на вопрос нет ответа, и спрашивающий прокомментировал, что он решил, не указав никакого решения.
Через некоторое время я нашел решение случайно. Это несколько грязно. Это вызвать syncState в onCreate. Потому что кажется, что по какой-то причине onPostCreate не вызывается в моем приложении. На самом деле, это грязное решение используется в ответе на другую проблему.
Но официальная ссылка гласит, чтобы вызвать syncState в onPostCreate. Почему это не работает? Почему мое приложение не вызывает 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;
}
...
}
1 ответ
Здесь на 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:
- Операция onPostCreate с двумя аргументами.
- OnPostCreate AppCompatActivity с одним аргументом.
Вы должны были ошибиться, выбрав первый, когда переопределяете метод в Android Studio.