Фрагмент закрытия приложения addToBackStack

Я не нашел решения для своей проблемы.

У меня есть несколько фрагментов (динамически созданных), но моя кнопка «Назад» вообще не работает, нажатие на нее закроет приложение, какой бы фрагмент ни был «активен».

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {

case R.id.itemAdd:
FragmentTransaction tx = getFragmentManager().beginTransaction();
    Fragment fragment = new NeuesProduktFrag();

    tx.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right,
             R.anim.slide_in_left, R.anim.slide_out_right);
     tx.replace(R.id.main, fragment);
     tx.addToBackStack(null);
     tx.commit();
    return true;

Все работает нормально, но после ввода фрагмента «NeuesProduktFrag» и нажатия кнопки «Назад» мое приложение закрывается. Пробовал на разных кнопках и т. д. Переопределение onBackPressed не нужно, верно? addToBackStack должен помочь или нет?


person Markus    schedule 23.09.2013    source источник
comment
addToBackStack, вероятно, не имеет ничего общего с проблемой, и проблема, вероятно, в файле onResume вашего фрагмента. посмотрите на трассировку стека и найдите, в чем проблема. Возможно, было бы полезно, если бы вы разместили это здесь тоже   -  person tyczj    schedule 23.09.2013


Ответы (4)


После того, как я долго боролся, это мой последний код:

@Override
public void onBackPressed() {

// initialize variables
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();

// check to see if stack is empty
if (fm.getBackStackEntryCount() > 0) {          
    fm.popBackStack();
    ft.commit();    
}
else {
    if (this.lastBackPressTime < System.currentTimeMillis() - 4000) {
Toast.makeText(this, "Nochmal drücken zum Beenden!", 4000).show();
this.lastBackPressTime = System.currentTimeMillis();
} else{
        super.onBackPressed();
    }        
}
}

Я использовал его в своей FragmentActivity и добавил двойную вкладку, чтобы окончательно закрыть приложение.

person Markus    schedule 07.11.2013

Я предполагаю, что проблема возникает при использовании getFragmentManager() вместо библиотеки поддержки getSupportFragmentManager() в библиотеке поддержки FragmentActivity. Например, если вы хотите, чтобы PreferenceFragment и setSupportActionBar() были вместе.

Я решил проблему в своем ActionBarActivity, скопировав реализацию onBackPressed() из android.app.Activity с некоторыми изменениями:

@Override
public void onBackPressed() {
    if (getFragmentManager().popBackStackImmediate()) return;
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)
        finish();
    else
        finishAfterTransition();
}
person Игорь Щербаков    schedule 27.10.2014

Мой код работал, переходя с FragmentActivity на Activity.

редактировать: ошибка при вводе

person Kani    schedule 20.05.2014
comment
Ну, я не использовал FrameActivity, я использовал FragmentActivity, который содержит статические фрагменты для отображения :) - person Markus; 21.05.2014

Нажмите кнопку «Назад», чтобы выйти из приложения

@Override
public void onBackPressed() {

    // initialize variables
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();

    // check to see if stack is empty
    if (fm.getBackStackEntryCount() > 1) {
        fm.popBackStack();
        ft.commit();
    } else {

        if (backPressedTime + 2000 > System.currentTimeMillis()) {
            backToast.cancel();
            finishAffinity();
            System.exit(1);
            return;
        } else {
            backToast = Toast.makeText(getBaseContext(), "press back again to exit", Toast.LENGTH_LONG);
            backToast.show();
        }
        backPressedTime = System.currentTimeMillis();
    }
}
person apdo    schedule 26.09.2019