如何在backstack中管理片段?

时间:2017-04-01 06:41:11

标签: android android-fragments fragment-backstack

我正在尝试以非常简单的方式管理片段。我创建了一个实用程序类,它将片段添加到backstack中,当我们按下后退按钮时,前面的片段显示出来。我很好。但是,当我试图清除所有碎片并显示根碎片时,我无法正确地执行此操作。以下是我的实用程序类:

def is_transitive(relation):
    for a,b in relation:
        for c,d in relation:
            if b == c and ((a,d) not in relation):
                    # print (a,b),(c,d) # uncomment for tests...
                    return False
    return True

当我想要另一个片段时,我只是通过" true"对于animatedReplace方法中的addToStack。当我想要清除后挡板时,我会通过" false"并调用clearBackStackToHome方法。任何人都能帮我解决我做错的事吗?

3 个答案:

答案 0 :(得分:0)

制作检查backStack为空的条件。当从backStack中删除所有片段然后显示您的根片段

答案 1 :(得分:0)

试试这个:

在您的Utility类中

public void clearBackStack() {
    FragmentManager manager = activity.getSupportFragmentManager();
    if (manager.getBackStackEntryCount() > 0) {
        FragmentManager.BackStackEntry first = manager
                .getBackStackEntryAt(0);
        manager.popBackStack(first.getId(),
                FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }
}

确保您的根/第一个片段animatedReplace()传递boolean addToBackStack = false

这样它就不会被清除。

修改

要在您的活动OnBackPressed()覆盖onBackPressed()中使用它,并添加以下代码:

 @Override
    public void onBackPressed() {
        FragmentManager fm = getSupportFragmentManager();
        if (fm.getBackStackEntryCount() > 0) {
             FragmentManager.BackStackEntry first = fm
                    .getBackStackEntryAt(0);
            fm.popBackStack(first.getId(),
                    FragmentManager.POP_BACK_STACK_INCLUSIVE);
            Log.i("MainActivity", "popping backstack");
        } else {
             super.onBackPressed(); 
        }
    }

答案 2 :(得分:0)

是的,您可以在MainActivity的 onBackPressed()方法中管理片段。 只需覆盖 onBackPressed(),并检查backStack计数,如果计数为零,则导航到根片段或退出app。此外,您可以根据检查后端堆栈中的哪个片段来实现您的代码。

@Override
public void onBackPressed() {


    FragmentManager fm = getSupportFragmentManager();
    int count = fm.getBackStackEntryCount();
    if (count >= 1) {
        if (fm.findFragmentById(R.id.main_container) instanceof yourFragment) {

            super.onBackPressed();

        }
    } else {
        // Show your root fragment  here
    }

}