2014-07-02 101 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); 
     } 
    }