2013-12-19 1 views
16

Как правильно использовать фрагменты во Фрагментах?Правильное использование суб-фрагментов с (Child) FragmentManager

My (упрощенный) использовать случай следующее, у меня есть деятельность с фрагментом макета и этот фрагмент 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? Конечно, Фрагмент - это новый фрагмент, но он также является новым, поэтому почему он работает с , но не с родительским фрагментом?

Во фрагменте я должен использовать фрагменты ChildFragmentManager, не так ли?

+0

Не тот же вопрос , но для других, которые приходят сюда, см. раздел [Связь между вложенными фрагментами в Android] (http://stackoverflow.com/questions/39491655/communication-between-nested-fragments-in-andro ID/39563977 # 39563977). – Suragch

ответ

7

Вы должны добавить SubFragment в Fragment так же, как вы добавляете Fragment в Activity. Я имею в виду добавление Fragment к Activity должен выглядеть следующим образом:

@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(); 
    } 
} 

Добавление SubFragment к MainFragment должен выглядеть следующим образом:

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(); 
     } 
     } 
    } 

или вы можете добавить фрагмент ребенка к Fragment в onCreate методе

+0

Я думаю, что это то, о чем писал ОП. – lionelmessi

+0

@ lionelmessi no, он использует onCreateVIEW vs onCreate. Я думаю, что это правильный ответ – HaydenKai

Смежные вопросы