Стрелка вверх не отображается после вызова 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();
после изменения значков навигационных значков для меня. Теперь оба значка отображаются правильно!
Надеюсь, это поможет кому-то!