管理片段状态

时间:2014-10-18 13:11:53

标签: android android-fragments

我对此感到头痛。

方案如下:

我有一个带有FrameLayout的Activity,它包含4个片段 我不介意每次重新创建碎片除了一个 有一个我需要保持不变。

这是我的导航方案:

Navigation scheme

我想要保留但不重新创建的片段是Frag A

在我的Activity中,我有这种方法来管理片段:

protected final static int FRAG_A=0;
protected final static int FRAG_B=1;
protected final static int FRAG_C=2;
protected final static int FRAG_D=3;

protected void displayNewFragment(int newFragment)
{
    Fragment fragment=null;
    String tag=null;

    switch(newFragment)
    {
        case FRAG_A:
            tag=FragA.TAG;
            fragment=new FragA();

            break;

        case FRAG_B:
            tag=FragB.TAG;
            fragment=new FragB();

            break;

        case FRAG_C:
            tag=FragC.TAG;
            fragment=new FragC();

            break;

        case FRAG_D:
            tag=FragD.TAG;
            fragment=new FragD();

            break;
    }

    if(fragment!=null)
        manager.beginTransaction().replace(R.id.main_container, fragment, tag).commit();
    else
        Log.e(getClass().getSimpleName(), "Error creating content (null).");
}

当我想切换到另一个时,片段调用此方法,parent对活动的引用(Main):

parent.displayNewFragment(Main.FRAG_A) // Or FRAG_B, C, D, etc

我知道我正在重新创建该方法中的每个实例,而前一个实例被销毁(因为我在片段事务中调用了replace。除了我要求的内容之外,这种方法很完美:
如何防止破坏FragA并保持其状态?

提前谢谢。

2 个答案:

答案 0 :(得分:1)

请使用 addToBackStack 来防止破坏片段并保持其状态如下所示: -

if(fragment!=null)
    manager.beginTransaction().replace(R.id.main_container, fragment, tag).addToBackStack("spartacus").commit();
else
    Log.e(getClass().getSimpleName(), "Error creating content (null).");

干杯...! 请告诉我它是否适合您:)

答案 1 :(得分:0)

  

要管理活动中的片段,您需要使用   FragmentManager。要获得它,请从您的调用getFragmentManager()   活性。

     

您可以使用FragmentManager执行的一些操作包括:

  • 使用findFragmentById()获取活动中存在的片段(对于在活动布局中提供UI的片段)或 findFragmentByTag()(用于提供或不提供UI的片段)。

  • 使用popBackStack()(用户模拟Back命令)从后台堆栈中弹出片段。

  • 使用addOnBackStackChangedListener()注册监听器以更改后台堆栈。