ActionBarDrawerToggle с AppCompatActivity и панелью инструментов "Назад" с фрагментами
Я использую ActionBarDrawerToggle с NavigationView. Мой контент отображается с использованием фрагментов.
Я следую за этим вопросом, чтобы заставить нажатие кнопки назад работать, но управление никогда не передается onOptionsItemSelected
,
Это мой MainActivity.class:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.openDrawerContentDescRes, R.string.closeDrawerContentDescRes);
mDrawerLayout.addDrawerListener(mDrawerToggle);
mDrawerToggle.syncState();
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() == 0) {
super.onBackPressed();
} else {
removeFragmentFromBackstack();
updateToolbarWithHomeButton();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
switch (item.getItemId()) {
case android.R.id.home:
// doesn't reach here ever.
return true;
case R.id.action_x:
// do something
return true;
case R.id.action_y:
// do something
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
private void updateToolbarWithBackButton() {
ActionBar actionBar = getSupportActionBar();
if (null != mDrawerToggle && null != actionBar) {
mDrawerToggle.setDrawerIndicatorEnabled(false);
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
private void updateToolbarWithHomeButton() {
ActionBar actionBar = getSupportActionBar();
if (null != mDrawerToggle && null != actionBar) {
actionBar.setDisplayHomeAsUpEnabled(false);
mDrawerToggle.setDrawerIndicatorEnabled(true);
mDrawerToggle.syncState();
}
}
Как я могу захватить кнопку Назад <- нажмите от Toolbar
?
Обновить:
Благодаря @mike кнопка со стрелкой назад на панели инструментов теперь захватывается внутри onOptionsItemSelected
в моем коде MainActivity, как обновлено ниже.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.openDrawerContentDescRes, R.string.closeDrawerContentDescRes);
mDrawerLayout.addDrawerListener(mDrawerToggle);
mDrawerToggle.syncState();
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() == 0) {
super.onBackPressed();
} else {
removeFragmentFromBackstack();
updateToolbarWithHomeButton();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
//TODO: skip back press if fragment backstack count is 0.
onBackPressed();
updateToolbarWithHomeButton();
return true;
case R.id.action_x:
// do something
return true;
case R.id.action_y:
// do something
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
private void updateToolbarWithBackButton() {
ActionBar actionBar = getSupportActionBar();
if (null != mDrawerToggle && null != actionBar) {
mDrawerToggle.setDrawerIndicatorEnabled(false);
}
}
private void updateToolbarWithHomeButton() {
ActionBar actionBar = getSupportActionBar();
if (null != mDrawerToggle && null != actionBar) {
mDrawerToggle.setDrawerIndicatorEnabled(true);
mDrawerToggle.syncState();
}
}
2 ответа
Если вы хотите onOptionsItemSelected()
метод срабатывания при нажатии на переключатель, удалите toolbar
аргумент от ActionBarDrawerToggle
вызов конструктора.
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.string.openDrawerContentDescRes, R.string.closeDrawerContentDescRes);
В противном случае переключатель управляет открытием и закрытием ящика внутри, а вызов ActionBarDrawerToggle#onOptionsItemSelected()
не обязательно
Если вы хотите справиться с нажатием на дом Button
по-разному в зависимости от текущего состояния, вы также можете удалить if
блок, который возвращается в верхней части onOptionsItemSelected()
метод.
И вы должны позвонить setDisplayHomeAsUpEnabled(true)
только один раз в onCreate()
, Вам не нужно постоянно включать и выключать это. Включение и отключение индикатора ящика позаботится об этом.
Удалить эту строку
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
от onOptionsItemSelected()
так это будет выглядеть так
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// doesn't reach here ever.
return true;
case R.id.action_x:
// do something
return true;
case R.id.action_y:
// do something
return true;
default:
return super.onOptionsItemSelected(item);
}
}