2013-12-19 97 views
16

如何在碎片中正確使用碎片?正確使用子子片段(子)FragmentManager

我(簡體)使用情況下,我有一個佈局片段的活性,這種片段theirself包含一個子片段......所有片段手動添加到他們的父母......

---------------------------------------------------------- 
- Activity            - 
-              - 
-              - 
-  ---------------------------------------   - 
-  - Fragment       -   - 
-  -          -   - 
-  - -----------------    -   - 
-  - - SubFragment -    -   - 
-  - -    -    -   - 
-  - -    -    -   - 
-  - -----------------    -   - 
-  ---------------------------------------   - 
-              - 
---------------------------------------------------------- 

現在,在我的活動的onCreate我以下:

if (savedInstanceState == null) 
{ 
    // I create the fragment 
    mMainFragment = new MainFragment(); 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.replace(R.id.fragment_main, mMainFragment); 
    transaction.commit(); 
} 
else 
{ 
    // I retrieve the fragment 
    mMainFragment = (BaseFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_main); 
} 

而在我的片段onCreate我獲得/創建我的小碎片:

mSubFragment = getChildFragmentManager().findFragmentByTag(SubFragment.class.getName()); 
if (mSubFragment == null) 
{ 
    mSubFragment = new SubFragment(); 
    getChildFragmentManager().beginTransaction().add(R.id.fragment_sub, mSubFragment, SubFragment.class.getName()).commit(); 
} 

問題

屏幕旋轉後,我的小碎片被添加兩次......如果我用的是活動的FragmentManager然後它......但爲什麼它不與ChildFragmentManager工作?當然,片段是一個新的片段,但活動也是一個新的片段,爲什麼它與活動的FragmentManager一起工作,但與父片段不一致?

在一個片段中,我應該使用片段ChildFragmentManager,不應該嗎?

+0

不一樣的問題,孩子的片段添加到Fragment ,但對於其他人來到這裏,請參閱相關[在Android中嵌套片段之間的通信](http://stackoverflow.com/questions/39491655/communication-between-nested-fragments-in-andro ID/39563977#39563977)。 – Suragch

回答

7

您應該像添加FragmentActivity一樣將SubFragment添加到Fragment。我的意思是加入FragmentActivity應該是這樣的:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    .... 
    if (savedInstanceState == null){ 
     //add fragment 
     mMainFragment = new MainFragment(); 
     FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
     transaction.replace(R.id.fragment_main, mMainFragment); 
     transaction.commit(); 
    } 
} 

添加SubFragmentMainFragment應該是這樣的:

public class MainFragment extends Fragment{ 

     @Override 
     public View onCreateView(LayoutInflater i, ViewGroup c, Bundle savedInstanceState) { 
      ... 
     if (savedInstanceState == null){ 
      mSubFragment = new SubFragment(); 

      //add child fragment 
      getChildFragmentManager() 
        .beginTransaction() 
        .add(R.id.fragment_sub, mSubFragment, "tag") 
        .commit(); 
     } 
     } 
    } 

,或者你可以在onCreate方法

+0

我認爲這是OP發佈的問題。 – lionelmessi

+0

@lionelmessi不,他使用onCreateVIEW vs onCreate。我認爲這是正確的答案 – HaydenKai