1

Я использую ActionBarDrawerToggle с NavigationView. Мое содержимое отображается с помощью фрагментов.ActionBarDrawerToggle с AppCompatActivity и панель инструментов Назад с фрагментами

Я следую за this stackoverflow question, чтобы получить кнопку «Назад», чтобы работать, но контроль никогда не течет до 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?


Update:

Благодаря @ 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(); 
    } 
} 

ответ

1

Если вы хотите метод onOptionsItemSelected() стрелять при нажатии на переключатель, удалите toolbar аргумент от вызова ActionBarDrawerToggle конструктора.

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
    R.string.openDrawerContentDescRes, R.string.closeDrawerContentDescRes); 

В противном случае, переключение ручки открывания и закрывания ящика внутри, и призыв к ActionBarDrawerToggle#onOptionsItemSelected() не является необходимым.

Если вы хотите обработать, нажав на дом Button по-разному в зависимости от текущего состояния, вы также хотите удалить if блок, который возвращает в верхней части метода onOptionsItemSelected().

И вы должны позвонить по телефону setDisplayHomeAsUpEnabled(true) только один раз в onCreate(). Вам не нужно включать и выключать его. Включение и отключение индикатора ящика позаботится об этом.

+0

Я снял панель с новой ActionBarDrawerToggle (это, mDrawerLayout, R.string.openDrawerContentDescRes, R.string.closeDrawerContentDescRes); но случай переключения для MenuItem с id android.R.id.home не проходит. Есть ли другой идентификатор для кнопки «Назад»? –

+0

Вызов 'mDrawerToggle.onOptionsItemSelected (item)' возвращает 'true', когда идентификатор' MenuItem' является 'android.R.id.home', так что блок' if' возвращается до того, как выполнение достигнет вашего 'switch' , Вы можете просто перенести этот вызов на свой первый «случай». –

+0

Я добавил оператор журнала внутри блока 'if', но он не возвращает true для' mDrawerToggle.onOptionsItemSelected (item) ', когда я нажимаю кнопку« Назад » –

0

Удалить эту строку

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); 
} 
} 
Смежные вопросы