Android oncreateview appelé deux fois

J'ai voir cette question posée ici plus d'une fois, mais je ne peux pas comprendre comment résoudre mon cas.

J'ai une application que l'utilisateur n'ceci:

1 - Ouvrir le navigationDrawer et sélectionne une option (un fragment est créé) (je suis ici sélectionner la seconde option);

public void selectItem(int position) {
        Fragment fragment = null;
        switch (position) {
            case FRAGMENT_OPTION1:
                ...
                break;
            case FRAGMENT_OPTION2:
                fragment = ControlPanelFragment.newInstance();
                break;
            ...
            case FRAGMENT_OPTIONN:
                ...
                return;
            default:
                break;
        }
        if (fragment != null) {
            FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction().replace(R.id.fragment_container, fragment).commitAllowingStateLoss();
        }
}

2 - L'option sélectionnée (ControlPanelFragment) est chargé:
2.1 - panneau de Contrôle dispose d'onglets et un iconpager. Pour chaque pager page et pour chaque onglet un nouveau fragment est créé. J'ai 3 onglets et 3 pages 9 fragments sont créés;

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    if (savedInstanceState != null) {
        currentControlPanelOption = savedInstanceState.getInt("currentControlPanelOption", currentControlPanelOption);
        currentControlPanelTab = savedInstanceState.getInt("currentControlPanelTab", currentControlPanelTab);
    }
    setControlPanelTabs();
    setIconPager();
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("currentControlPanelOption", pager.getCurrentItem());
    outState.putInt("currentControlPanelTab", mTabHost.getCurrentTab());
}

3 - Dans le setIconPager(); j'ai ce code:

pager = (ViewPager) view.findViewById(R.id.pager);
cPanelPagerAdapter = new ControlPanelPagerAdapter(getChildFragmentManager());
pager.setOffscreenPageLimit(2);
pager.setAdapter(cPanelPagerAdapter);

ControlPanelPagerAdapter a ce code:

public Fragment getItem(int index) {
    Fragment fragment;
    switch (index) {
        case 1:
            fragment = FragmentA.newInstance();
            break;
        case 2:
            fragment = FragmentB.newInstance();
            break;
        case 3:
            fragment = FragmentC.newInstance();
            break;
        default:
            fragment = null;
            break;
    }
    ...
    return fragment;
}

4 - FragmentA, FragmentB et FragmentC ont presque le même code:

public static FragmentA newInstance() {
return new FragmentA();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_placeholder, container, false);
return view;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (savedInstanceState == null) {
fragmentA_Data = new FragmentADetail[3];
createTabInstance(0);
} else {
fragmentA_Data = (FragmentADetail[]) savedInstanceState.getSerializable("Data");
return;
}
}
private void createTabInstance(int tab) {
new FragmentADetail();
fragment = FragmentADetail.newInstance(tab);
Bundle args = new Bundle();
args.putInt("tab", tab);
fragment.setArguments(args);
fragmentA_Data[tab] = fragment;
FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_placeholder, fragmentA_Data[tab]);
fragmentTransaction.commitAllowingStateLoss();
}
public void getTabData(int tab) {
if (fragmentA_Data[tab] == null) {
createStoreTimePeriodInstance(tab);
} else {
if (fragmentA_Data[tab].getArguments() == null) {
Bundle args = new Bundle();
args.putInt("tab", tab);
fragmentA_Data[tab].setArguments(args);
}
FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_placeholder, fragmentA_Data[tab]);
fragmentTransaction.commitAllowingStateLoss();
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("data", fragmentA_Data);
}

5 - Enfin, FragmentADetail a ce code:

public static FragmentADetail newInstance(int tab) {
selectedTab = tab;
return new FragmentADetail();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.details_fragment, container, false);
...
if (savedInstanceState != null) {
selectedTab = savedInstanceState.getInt("selectedTab");
}
...
}
public void getTabData(int tab) {
//This is where I'm getting the data that populates the layout
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("selectedTab", selectedTab);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Bundle args = getArguments();
if (args != null) {
getTabData(args.getInt("tab"));
}
}

Maintenant, imaginez que je suis sur FragmentA avec le troisième onglet sélectionné. Si je tourne l'écran, j'ai cette séquence d'événements:

  1. ControlPanelFragment onSaveInstanceState enregistre l'onglet actif et actuel fragment
  2. FragmentA onSaveInstanceState enregistre les onglets de fragments pour la pagination
  3. navigationDrawer deuxième option est de nouveau appelé fragment = ControlPanelFragment.newInstance();
  4. ControlPanelFragment onViewCreated est appelé, et je peux récupérer les données enregistrées des informations et un nouveau pager et les onglets sont créés
  5. FragmentA onViewCreated est appelé et je peux extraire les données enregistrées
  6. FragmentADetail onActivityCreated obtient les données enregistrées et charge les données correctelly (du moins je pense)
    Et à partir de maintenant un deuxième ensemble de méthodes est appelée la seconde fois et les données qui a été précédemment enregistré est réinitialisé et il affiche désormais des données erronées
  7. ControlPanelFragment onSaveInstanceState mais maintenant, le savedInstanceState est null
  8. ControlPanelPagerAdapter getItem s'appelle l'instanciation de la 3 fragments
  9. FragmentA onSaveInstanceState son maintenant appelé mais savedInstanceState est null
  10. FragmentADetail onActivityCreated est appelée, mais maintenant l'onglet = 0

Quelqu'un peut m'expliquer-moi comment puis-je arrêter les étapes 7 à 10 de se produire?

InformationsquelleAutor Favolas | 2014-12-31