Стрелка отображается вместо иконки дизайна гамбургера. Почему не работает 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:

  1. Операция onPostCreate с двумя аргументами.
  2. OnPostCreate AppCompatActivity с одним аргументом.

Вы должны были ошибиться, выбрав первый, когда переопределяете метод в Android Studio.