如何避免在转到上一个片段时关闭活动

时间:2018-01-16 06:05:59

标签: android fragment android-fragmentactivity

我有一个由2个片段组成的活动,我在我的活动中反对的内容是这样的。

private Boolean exit = false;

@Override
public void onBackPressed() {
    if (exit) {
        moveTaskToBack(true);    
        finish(); // finish activity
    } else {
        Toast.makeText(this, "Press Back again to Exit.",
        Toast.LENGTH_SHORT).show();
        exit = true;
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                exit = false;
            }
        }, 3 * 1000);
    }
}

这导致直接关闭应用程序,即使我在片段2,实际应该发生的是它应该回到片段1没有关闭任何帮助......

3 个答案:

答案 0 :(得分:2)

使用它:

@Override
public void onBackPressed() {

    int fragmentCount = getSupportFragmentManager().getBackStackEntryCount();
    if (fragmentCount == 1) {
        finish();
    } else {
        if (fragmentCount > 1) {
            getFragmentManager().popBackStack();
        } else {
            super.onBackPressed();
        }

    }
}

看看它是否有效。顺便说一句,它不是我的工作,但应该有效。

答案 1 :(得分:0)

首先检查您是否将片段添加到stack。例如,如果您要从FirstFragment导航到SecondFragment

FragmentManager manager = getSupportFragmentManager();
SecondFragment fragment = new SecondFragment();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.container, fragment).addToBackStack("tag");
transaction.commit();

然后在activity覆盖onBackPressed as,

@Override
public void onBackPressed() {
     if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
          getSupportFragmentManager().popBackStackImmediate();
     } else {
          super.onBackPressed();
     }
}

上面的方法从FirstFragment导航到SecondFragment,点击SecondFragment上的后退按钮(如果片段堆栈为空,则从按下后退按钮上的活动返回)。

编辑: - 并始终尝试从活动中启动片段。永远不要碎片(这不是一个好习惯)。因为片段基本上是活动的一个实例,所以它需要从活动上下文开始,以更好地执行而不是片段上下文。

例如,如果您想从SecondFragment开始FirstFragment,那么在您的活动中创建一个方法,

public void startSecondFragment(){
   FragmentManager manager = getSupportFragmentManager();
   SecondFragment fragment = new SecondFragment();
   FragmentTransaction transaction = manager.beginTransaction();
   transaction.replace(R.id.container, fragment).addToBackStack("tag");
   transaction.commit();
}

然后在FirstFragment当你想要开始SecondFragment时,你就可以开始了,

((YourActivity) getActivity()).startSecondFragment();

答案 2 :(得分:0)

只需在片段交易中使用 addToBackStack(null)

fragmentManager.beginTransaction()
            .replace(R.id.content_frame, list)
            .addToBackStack(null)
            .commit();

关于活动onBackPressed()

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0 ){
        getFragmentManager().popBackStackImmediate();
    } else {
        super.onBackPressed();
    }
}

希望这会对你有所帮助。