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);
où 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:
- ControlPanelFragment
onSaveInstanceState
enregistre l'onglet actif et actuel fragment - FragmentA
onSaveInstanceState
enregistre les onglets de fragments pour la pagination - navigationDrawer deuxième option est de nouveau appelé
fragment = ControlPanelFragment.newInstance();
- 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 - FragmentA
onViewCreated
est appelé et je peux extraire les données enregistrées - 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 - ControlPanelFragment
onSaveInstanceState
mais maintenant, le savedInstanceState est null - ControlPanelPagerAdapter
getItem
s'appelle l'instanciation de la 3 fragments - FragmentA
onSaveInstanceState
son maintenant appelé mais savedInstanceState est null - 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?
Vous devez vous connecter pour publier un commentaire.
- Je savoir quel était mon problème.
Quand je faisais:
J'ai été la création d'un fragment et quand je fait tourner l'écran
selectItem(int position)
a de nouveau été appelé ainsi une nouvelle instance d'un même objet a été créé ainsi les étapes7
et suivantes. La solution a été de vérifier si le fragment a déjà été créé et de l'utiliser au lieu d'en créer un nouveau.J'ai enregistré le fragment initial avec une étiquette et avaient l'air de cette balise. Si le tag existe, utilisez ce fragment sinon, créez-en un nouveau.
getSupportFragmentManager().findFragmentByTag(TAG)
avant de créer un nouveau fragment.