2014-10-18 106 views
0

我对此感到头疼。管理碎片状态

的场景是以下内容:

我有与承载4个片段A的FrameLayout一个活动。
我不介意重新创建每个片段,除了其中一个
有一个我需要保持不变。

这里是我的导航方案:

Navigation scheme

我想保留,而不是重建的片段是破片一

在我的活动我有用于管理该片段此方法:

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的参考活性(主):

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

我知道,我重新创建每个实例在方法和以前被破坏(如我所说的片段交易replace这个工程除了要问什么,我完美:
如何防止破坏FragA并保持其状态?

预先感谢您。

回答

1

请使用addToBackStack到prvent破坏片段,并保持其状态如下表: -

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

干杯... !!! 请让我知道如果你的工作或不:)

+0

首先,谢谢你的回答。但这不是解决方案。除非绝对必要,否则我不想将该片段添加到BackStack。我最终在Activity中设置了一个引用FragA的全局变量,而不是在'displayNewFragment'方法中重新实例化它。然后在片段中,我重新使用'onCreateView'中的根视图,而不是每次重新创建。我几乎可以肯定,这不是最好的解决方案,但现在它的工作。我会继续尝试其他方法。干杯。 – Alberto 2014-10-20 11:08:52

0

要在活动管理的片段,你需要使用 FragmentManager。要获取它,请从 活动中调用getFragmentManager()。

一些东西,你可以用FragmentManager操作包括:

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

  • 使用popBackStack()(模拟用户的Back命令)将背离堆栈的碎片弹出。

  • 使用addOnBackStackChangedListener()注册侦听器以更改返回堆栈。