Отсутствует значок навигации после переключения с ICS ActionBar на панель инструментов Lollipop
У меня есть активность со многими фрагментами, которые используют панель действий и навигационный ящик. У него включен режим "home as up". Я реализовал правильную логику, что только фрагменты верхнего уровня показывают значок переключателя панели действий, а другие фрагменты отображают стрелку. Я достиг этого:
mDrawerToggle.setDrawerIndicatorEnabled(false);
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, mDrawerList);
Теперь старая библиотека поддержки v4 ActionBarDrawerToggle стала устаревшей. Я перешел на версию v7 вместе с новым Toolbar
, чтобы получить вид Material Design. После этого, когда ящик открыт, стрелка "вверх" отображается правильно, но когда выполняется вышеупомянутый код, он полностью исчезает.
Является ли это ошибкой в библиотеке поддержки, или мне нужно сделать что-то другое, чтобы показать стрелку "вверх" вместо индикатора ящика?
Ответы
Ответ 1
Вы пытались настроить отображаемый индикатор с помощью getV7DrawerToggleDelegate().getThemeUpIndicator ()
и установить его после отключения индикатора?
Потому что, когда индикатор отключен, ActionBarDrawerToggle
пытается установить предыдущий индикатор.
Из ActionBarDrawerToggle
источника:
public void setDrawerIndicatorEnabled(boolean enable) {
if (enable != mDrawerIndicatorEnabled) {
if (enable) {
setActionBarUpIndicator((Drawable) mSlider,
mDrawerLayout.isDrawerOpen(GravityCompat.START) ?
mCloseDrawerContentDescRes : mOpenDrawerContentDescRes);
} else {
setActionBarUpIndicator(mHomeAsUpIndicator, 0);
}
mDrawerIndicatorEnabled = enable;
}
}
Edit:
С учетом устаревания ActionBarActivity
вы должны использовать getDrawerToggleDelegate().getThemeUpIndicator ()
Ответ 2
Ответ/комментарии Никола Деспотоски и Андрея Новикова совершенно правильны, но я хочу упомянуть, что после замены панели инструментов следующий код:
drawerToggle.setDrawerIndicatorEnabled(false);
drawerToggle.setHomeAsUpIndicator(getV7DrawerToggleDelegate().getThemeUpIndicator());
setSupportActionBar(toolbar);
ваша активность будет получать каждый из событий onOptionsItemsSelected, даже если вы снова включите свой лоток в Google drawerToggle.setDrawerIndicatorEnabled(true);
Поэтому вам нужно справиться с этим, я закончил с
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
if (drawerToggle.isDrawerIndicatorEnabled()) {
return drawerToggle.onOptionsItemSelected(item);
} else {
onBackPressed();
return true;
}
default:
return super.onOptionsItemSelected(item);
}
}
Ответ 3
Если вы используете AppCompatActivity, вы можете получить значок нужного ящика и задний значок
if(homeUp)
{
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
mDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
}
else
{
mDrawerToggle.setDrawerIndicatorEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mDrawerToggle.syncState();
}
Без необходимости getV7DrawerToggleDelegate: D