2014-07-02 63 views
2

我有一个应用程序,其中包含一个Activity和两个片段。期望的行为是(蓝色高亮显示的用户交互):布局变化时的片段管理

在肖像

enter image description here

在景观

enter image description here

我目前的解决办法是:

布局景观

FrameLayout 
    ContainerRed(FrameLayout) 
    ContainerYellow(FrameLayout) 

布局肖像

LinearLayout 
    ContainerRed(FrameLayout weight=1) 
    ContainerYellow(FrameLayout weight=1) 

当用户点击绿色按钮,我做了以下交易:

  • 在画像:删除FragmentA ,将FragmentB添加到containerYellow,addToBackstack
  • 在景观:添加FragmentB到contanerYellow,addToBackstack

这实现,除非你交易后旋转设备,例如,如果你是在肖像,往屏幕B1一个正确的行为,然后旋转设备横向FragmentA插槽是空的。

此外,如果您在屏幕B2中并将屏幕旋转至肖像,FragmentA将显示在FragmentB的背景中。

我该如何解决这个问题?感谢

回答

2

我有一个可行的解决方案:

首先使用相同的标记为addToBackstack(“FOO”);

。在活动通话的onCreate方法的末尾:

Fragment fragmentB=getFragmentManager().findFragmentByTag("FRAGMENT_B_TAG"); 
if (fragmentB!=null){ 
    getFragmentManager().popBackStackImmediate("FOO", 
       FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    attachFragmentB(fragmentB); 
} 

void attachFragmentB(Fragment fragmentB){ 
    //In portrait: Remove FragmentA, add FragmentB to containerYellow, addToBackstack("FOO") 
    //In landscape: add FragmentB to contanerYellow, addToBackstack("FOO") 
} 
+0

哦我明白了,你使用标签来跟踪活动堆栈呢?这段代码是否进入FragmentA的onCreate? – reidisaki

+0

不,它进入包含两个碎片的Activity的onCreate。基本上用这个代码,你恢复你在另一个方向做的碎片交易,并重新按照新的方向做 – Addev

+0

啊,我明白了!谢谢 – reidisaki

1

这样做没有多个布局和堆栈中的技巧的另一种方法是修改都在的onCreate容器的可见性()和在onBackStackChanged()中。

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     if (savedInstanceState == null) { 
      if (getSupportFragmentManager().findFragmentByTag(AFragment.TAG) == null) { 
       Fragment fragment = new AFragment(); 
       getSupportFragmentManager() 
         .beginTransaction() 
         .replace(R.id.layout_left, fragment,AFragment.TAG) 
         .commit(); 
      } 
     } 
     getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { 
      @Override 
      public void onBackStackChanged() { 
       updateScreen(); 
      } 
     }); 
     updateScreen(); 
    } 

    //called when A button's is clicked 
    public void onClick() { 
     if (getSupportFragmentManager().findFragmentByTag(BFragment.TAG) == null) { 
      Fragment fragment = new BFragment(); 
      getSupportFragmentManager() 
        .beginTransaction() 
        .replace(R.id.layout_right, fragment, BFragment.TAG) 
        .addToBackStack(BFragment.TAG) 
        .commit(); 
     } 
    } 

    public void updateScreen(){ 
     if (getSupportFragmentManager().findFragmentByTag(BFragment.TAG) != null){ 
      if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){ 
       findViewById(R.id.layout_right).setVisibility(View.VISIBLE); 
       findViewById(R.id.layout_left).setVisibility(View.VISIBLE); 
      }else{ 
       findViewById(R.id.layout_right).setVisibility(View.VISIBLE); 
       findViewById(R.id.layout_left).setVisibility(View.GONE); 
      } 
     }else{ 
      findViewById(R.id.layout_right).setVisibility(View.GONE); 
      findViewById(R.id.layout_left).setVisibility(View.VISIBLE); 
     } 
    }