FragmentPagerAdapter - Comment gérer les Changements d'Orientation?
- Je utiliser un FragmentPagerAdapter
contenant plusieurs Fragments qui ont besoin d'être informés à propos des changements à la database
. Je le fais en une itération sur les fragments, qui implémentent une interface de rappel et d'appel à un refreshData()
méthode.
Cela fonctionne bien jusqu'à ce que l'appareil change d'orientation. Après un changement d'orientation, le fragment de l'INTERFACE utilisateur n'a visiblement pas actualiser même si l'appel de la méthode semble fonctionner.
De ce que j'ai lu jusqu'à présent cela se produit parce que le FragmentPagerAdapter
gère le fragment du cycle de vie et les fragments de recevoir le rappel ne sont pas celles qui sont affichées.
private class DataPagerAdapter extends FragmentPagerAdapter {
private DataFragment[] fragments = new DataFragment[] {
new FooDataFragment(), BarDataFragment()};
public DataPagerAdapter(android.support.v4.app.FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return fragments[position];
}
@Override
public int getCount() {
return fragments.length;
}
public DataFragment[] getFragments() {
return fragments;
}
}
protected void refreshData() {
for (DataFragment dataFragment : mPagerAdapter.getFragments()) {
dataFragment.refreshData();
}
Je temporairement résolu ce problème à l'aide d'un récepteur de radiodiffusion à l'intérieur de chaque fragment, mais cette solution semble être inutile et peut créer des fuites de mémoire. Comment puis-je corriger cela? J'utilise une mise en page différente et la logique en mode paysage si je veux utiliser le nouvellement créé fragments après un changement d'orientation.
- ajoutez à cela ur l'activité de la balise dans le Manifeste android:configChanges="orientation|screenSize|keyboardHidden" (Cible API 13+)
- minSdkVersion est 7 donc cela ne marchera pas pour moi
Vous devez vous connecter pour publier un commentaire.
Oui comme vous l'avez dit FragmentManager poignées des fragments après changement d'orientation afin
getItem
dans l'adaptateur n'est pas appelé. Mais vous pouvez remplacer la méthodeinstantiateItem()
qui est appelé, même après le changement d'orientation et de convertir l'Objet de Fragment et de l'enregistrer dans votre tableau.instantiateItem(ViewGroup container, int position)
, pasinstantiateItem(View container, int position)
. Espère que ça va marcher maintenant.return "android:switcher:" + viewId + ":" + index;
viewId
est le contenant de l'affichage de l'id, etindex
est le fragment de la position. En utilisant cela, j'ai été en mesure de tirer les fragments de la FragmentManager.Ne pourrais pas vous suffit de régler le android:configChanges drapeau sur votre Activité en AndroidManifest.xml pour éviter d'activité pour être recréé?
là aussi, vous pouvez trouver plus de possibilités:
https://android.jlelse.eu/handling-orientation-changes-in-android-7072958c442a
J'ai eu le même problème, ma solution de travail:
Dans une activité où une carte d'appel
adapter.notifyDataSetChanged();
remplacer getItemPostion() la méthode de votre carte
mon
FragmentStatePagerAdapater
(ma carte) ne contient qu'un seul type de fragment, mais je suis pense, que vous pouvez utiliserinstanceof
(pour plus de types de Fragments) et ensuite utiliser la fonte ou chaque fragment va implémenter l'Interface avec la méthoderefresh()
Puis ajouter une méthode
refresh()
dans votre Fragment(s) et l'utilisation de cette mise en œuvre:Cela a fonctionné pour moi.
Mon avis:
Le problème est venu, lorsque le dispositif de changement d'orientation, l'adaptateur est détruit, mais les fragments sont encore dans la mémoire système et essayer de les réutiliser après changement d'orientation, mais les points de vue qui sont contient dans les fragments sont détruits trop et des fragments doit être "recréer" (appel
onCreateView
méthode ). Peut-être que je me trompe, donc s'il vous plaît corrigez-moi... .(Désolé pour mon anglais )