Кнопка назад на панели инструментов не закрывает текущий фрагмент

У меня есть активность, которая загружает фрагмент на создание. И у меня есть панель инструментов для этого действия, в которой есть кнопка, которая при нажатии добавляет новый фрагмент поверх того, который был создан первым.

Теперь на этой панели инструментов при нажатии я хочу удалить более новый фрагмент, чтобы он просто сместил фрагмент, находящийся внизу (более старый). Я искал, и я вроде понял это, за исключением одной вещи.

Я сделал это так, чтобы он пытался увидеть, нажата ли кнопка панели инструментов:

@Override
    public boolean onKeyUp(int keyCode, KeyEvent objEvent) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            onBackPressed();
            return true;
        }
        return super.onKeyUp(keyCode, objEvent);
    }


 @Override
    public void onBackPressed() {
        FragmentManager mFM = getSupportFragmentManager();
        if(mFM.findFragmentByTag("NewFragment") != null){
            mFM.beginTransaction().remove(mFM.findFragmentByTag("NewFragment")).commit();
        }
    }

Проблема в том, что "keyCode" равен KEYCODE_BACK, только когда вы нажимаете "кнопку возврата оборудования", а не кнопку "Назад" на панели инструментов. Это дает мне код 58, а не 4 (KEYCODE_BACK).

2 ответа

Решение

Я верю, что вы ищете NavigationListener для Toolbar Widget:

mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed();
        }
    });

но если вы используете тему с ActionBar и установить supportActionBar, затем сделать что-то:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()){
        case android.R.id.home:
            onBackPressed();
            break;
    }
    return true;
}

Из вашего вопроса не ясно, задаете ли вы вопрос управления фрагментами (FragmentTransaction remove vs. replace) или вопрос кнопки панели инструментов. Я полагаю, последний...

Панель инструментов Android или ActionBar должны иметь действия, которые обрабатываются с помощью:

@Override
public Boolean onOptionsItemSelected(MenuItem item)
{
 switch (item.getItemId())
 {
  case MY_BACK_BUTTON:
    myBackPressedHandler();
    return (true);
 }
 return (false);
}

это предполагает, что ваша кнопка "Назад" добавлена ​​в качестве элемента MenuItem и ей был присвоен идентификатор MY_BACK_BUTTON.

Для панели инструментов вы можете использовать MenuItemClickListener для обработки событий щелчка:

mToolbar.setOnMenuItemClickListener(MenuItem menuItem)
{
 @Override
 public Boolean onMenuItemClick(MenuItem menuItem)
 {
  // call onOptionsItemSelected, or handle the click here directly
  return (thisFragment.onOptionsItemSelected(menuItem));
 }
});

Если вы ссылаетесь на кнопку "Вверх" на панели инструментов / панели действий, то есть setDisplayHomeAsUpEnabled(true), это будет иметь getItemId() android.R.id.home и может обрабатываться аналогичным образом:

case android.R.id.home:
  myBackPressedHandler();
  return (true);
Другие вопросы по тегам