Стрелка вверх не отображается после вызова ActionBarDrawerToggle.setDrawerIndicatorEnabled(false)

В названии говорится все. Когда я вызываю mDrawerToggle.setDrawerIndicatorEnabled(false), я не хочу, чтобы значок "hamburger" отображался больше, но стрелка назад назад.

К сожалению, когда я называю этот метод, только заголовок отображается без обратной стрелки или значка "гамбургер". После того, как параметр drawerIndicatorEnabled будет отображаться снова, он снова отобразит значок "гамбургер".

Я установил getSupportActionBar().setDisplayHomeAsUpEnabled(true) и getSupportActionBar().setDisplayShowHomeEnabled(true)

Edit: В основном предложенное здесь решение: Изменить значок ящика назад на стрелку назад, как-то не дает мне стрелку назад.

Кто-нибудь знает решение этой проблемы? Большое вам спасибо!

Ответ 1

После нескольких часов испытаний и ошибок я придумал решение, которое позволяет переключаться с "гамбургера" на "стрелку" и обратно. Это очень странно и неестественно, не спрашивайте меня, почему он работает таким образом, но он работает. Кроме того, это единственное решение, которое позволило мне это сделать, ничего более не работало.

У меня есть только одно действие с фрагментами. Когда я переключаюсь с одного фрагмента на другой, я устанавливаю логическую переменную в своей активности displayingInnerFragment. Для тех фрагментов, где displayingInnerFragment == true, я показываю "стрелку" в верхнем левом углу, а для всех остальных я показываю "гамбургер". Следующий код, который я выполняю перед переключением на любой фрагмент:

    ActionBar actionBar = getSupportActionBar();
    if (displayingInnerFragment) {
        actionBar.setDisplayHomeAsUpEnabled(false);
        drawerToggle.setDrawerIndicatorEnabled(false);
        actionBar.setDisplayHomeAsUpEnabled(true);
    } else {
        drawerToggle.setDrawerIndicatorEnabled(true);
    }

Обратите внимание на двойной вызов actionBar.setDisplayHomeAsUpEnabled() в одной ветки. Это необходимо для работы drawerToggle.setDrawerIndicatorEnabled(false). В противном случае он не будет работать должным образом. Все другие варианты либо не показывают "стрелку", либо скрывают "стрелку" или "гамбургер" в тот или иной момент.

Ответ 2

Используйте это:

mDrawerToggle.setHomeAsUpIndicator(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
mDrawerToggle.setDrawerIndicatorEnabled(false);
mDrawerToggle.syncState();

Ответ 3

Это немного меня озадачило, так как я знал, что используется значок по умолчанию (смотря на источник ActionBarDrawerToggle), и я хотел, чтобы он принял набор цветов для R.attr.colorControlNormal. Удивительно, порядок этих двух линий имеет решающее значение для фактического отображения стрелки вверх:

mDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

setDrawerIndicatorEnabled должен быть вызван на ваш ActionBarDrawerToggle , прежде чем setDisplayHomeAsUpEnabled вызывается на вашем ActionBar. Обе строки должны быть вызваны для отображения по умолчанию (тонированной) стрелки.

Ответ 4

Я также сталкиваюсь с той же проблемой (это либо значок < значок, либо значок меню, но не оба) и, наконец, нашел, что работает для меня.

Дополнительная информация: я использую библиотеку поддержки 25, поэтому она может играть роль здесь, так как я не тестировал предыдущую версию библиотеки. Я использую панель инструментов как панель действий и настраиваю ActionDrawerToggle с помощью метода, в котором есть параметр панели инструментов. Однако я тестировал это только на устройстве Android M.

Ниже приведен код, как я включил/отключил навигационный ящик (функция находится в фрагменте NavigationDrawer).

public void setDrawerEnabled(final boolean enabled) {

    int lockMode = enabled ? DrawerLayout.LOCK_MODE_UNLOCKED :
            DrawerLayout.LOCK_MODE_LOCKED_CLOSED;

    mDrawerLayout.setDrawerLockMode(lockMode);
    mDrawerToggle.setDrawerIndicatorEnabled(enabled);

    ActionBar actionBar = null;
    if (getActivity() instanceof AppCompatActivity) {
        actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
    }

    if (actionBar != null) {
        actionBar.setDisplayHomeAsUpEnabled(!enabled);
        actionBar.setDefaultDisplayHomeAsUpEnabled(!enabled);
        actionBar.setDisplayShowHomeEnabled(enabled);
        actionBar.setHomeButtonEnabled(enabled);
    }

    mDrawerToggle.syncState();

    mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            if (!mDrawerToggle.isDrawerIndicatorEnabled())
                getActivity().onBackPressed();

        }
    });
}

В моем случае установка actionBar.setHomeButtonEnabled(enabled); заставляет его рисовать значок меню (иначе, в моем случае, когда первый фрагмент будет возобновлен, значок навигации не будет отображаться), хотя он прекратит воспроизведение <; значок для других фрагментов. Установка mDrawerToggle.syncState(); после изменения значков навигационных значков для меня. Теперь оба значка отображаются правильно!

Надеюсь, это поможет кому-то!