如何在特定条件下清除android中的碎片backStack

时间:2014-02-22 08:44:33

标签: android android-fragments fragment back-stack

我有一个活动,我通过在我的活动的框架布局中加载不同的不同片段来加载我的应用程序的所有细节。

在简单流程的情况下,当我加载A> B> C> D然后回到D> C> B> A按预期正常工作。我总是希望在按下后退时从B移动到A.

但是现在在一个例子中,我有不同的seq。我在其中加载A> B> C然后从C我有一个按钮,我需要再次加载B.现在,当用户按回B时,我需要再次转到A而不转到C.所以为了实现这一点,在父活动的onKeyDown事件中,我检查了如果当前片段是我的B片段,那么只需加载一个片段,通过popBackStackImmediate()清除backstack(因为我不再需要它了)。但是现在当我按回B然后它会加载片段A但片段B没有被删除。我还试图检查几个手动删除和添加片段的答案,但仍然没有运气。如果您对此有任何建议,请向我解释添加和删除的过程或给我一些参考站点位置,我可以获取详细信息。

我试图弄清楚背斜的确切工作,但在那也没有运气。我不明白发生了什么(为什么片段B没有删除并被添加到A)。过去两天我一直在尝试这个。请帮帮我。

提前多多感谢。

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // Log.e(LOG_TAG, "Key down = " + keyCode);
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (getSupportFragmentManager().findFragmentByTag(
                    RefillMainScreen.FRAGMENT_TAG) != null) {
                RefillMainScreen refillMainScreen = (RefillMainScreen)                                                                                                                           getSupportFragmentManager()
                        .findFragmentByTag(RefillMainScreen.FRAGMENT_TAG);
                if (refillMainScreen.isVisible()) {
                      MainActivity.displayBackStack(getSupportFragmentManager());
                    while (getSupportFragmentManager().getBackStackEntryCount() > 1) {
                        getSupportFragmentManager().popBackStackImmediate();
                    }
                    loadFragment(new DashboardFragment(), false);

                } else {
                    super.onKeyDown(keyCode, event);
                }
            } else {
                super.onKeyDown(keyCode, event);
            }
            return true;
        } else {
            return super.onKeyDown(keyCode, event);
        }
    }

2 个答案:

答案 0 :(得分:1)

在按钮上单击C - A所需的位置,只需将后面的堆栈弹出为

public void onClick(View v){
   fragmentManager.popBackStack();
}

这将从后面的堆栈中弹出C,即将其取出或移除,然后你将返回到B,因为你将来自A时将B添加到后面的堆栈中,在来自B的onBackPress上你将被带回A ,你想要的方式。 :)

答案 1 :(得分:0)

当您从C移动到B时,不要调用方法addToBackStack()。这样,交易将不会被记住。