Fragments à l'intérieur de ViewPager disparaissent lorsque l'orientation change

J'ai lu plusieurs publications ( http://tinyurl.com/pb8es74 , http://tinyurl.com/p9pcfcv .. ) à ce sujet, mais je ne trouve pas de solution.

J'ai une MainActivity qui charge une mise en page contenant un ViewPager avec trois fragments (qui ont des configurations différentes en fonction de l'orientation).

  • Android et Robotium - Test d'activité qui s'attend à un supplément?
  • Activer le clavier «Terminé» pour NumberPicker
  • Impossible d'augmenter le stockage interne de l'émulateur Android
  • Enregistrement programmatique d'un récepteur de diffusion
  • Comment installer des applications par programme sans ouvrir Play Store (comme Google Drive le fait)
  • NullPointerException sur findViewById () dans Android
  • J'ai ajouté cette fonctionnalité à l'activité afin qu'elle ne soit pas détruite lorsque l'orientation change, car je pourrais avoir des dialogues ou des pop-ups ouverts:

    android:configChanges="keyboardHidden|orientation|screenSize|screenLayout|uiMode" 

    Par conséquent, j'ai écrasé la méthode "onConfigurationChanged" qui appelle simplement la méthode loadLayout, où tout ce qui concerne la vue est fait:

      private void loadLayout() { setContentView(R.layout.layout_main_activity); pager = (ViewPager) this.findViewById(R.id.pager); pager.setPageTransformer(true, new DepthPageTransformer()); adapter = new MyFragmentPagerAdapter(getSupportFragmentManager()); adapter.addFragment(Fragment1.getInstance()); adapter.addFragment(Fragment2.getInstance()); adapter.addFragment(Fragment3.getInstance()); pager.setAdapter(adapter); pager.setOffscreenPageLimit(2); //Media controllers imgMediaController= (ImageButton) findViewById(R.id.media_controller); imgMediaController.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { [...] } }); imgVolumeController= (ImageButton) findViewById(R.id.volume_controller); gM.setImgVolumeController(imgVolumeController); imgVolumeController.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { [...] } }); } 

    Le code pour les fragments est égal:

     public class FragmentNature extends Fragment { private static FragmentNature instance; private SoundManager sM; private View rootView; Hashtable<String, ImageButton> h_Images; private Handler repeatUpdateHandler = new Handler(); private Toast volumeToast; public static FragmentNature getInstance() { if (instance == null) instance = new FragmentNature(); return instance; } public void nullInstance() { instance=null; } public FragmentNature(){ h_Images=new Hashtable<String,ImageButton>(); } public void onCreate(Bundle savedInstanceState) { Log.d("Naturing", "On create->Estoy en el fragment nature"); super.onActivityCreated(savedInstanceState); sM=SoundManager.getInstance(); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { rootView=null; Log.d("Naturing", "On createView->Estoy en el fragment nature"); rootView = inflater.inflate(R.layout.fragment_nature, container, false); final ImageButton imgRain= (ImageButton) rootView.findViewById(R.id.n_rain); h_Images.put("n_rain",imgRain); imgRain.setImageResource(R.drawable.n_rainsel); final ImageButton imgRiver= (ImageButton) rootView.findViewById(R.id.n_river); imgRiver.setImageResource(R.drawable.n_riversel); final ImageButton imgWave= (ImageButton) rootView.findViewById(R.id.n_wave); h_Images.put("n_wave",imgWave); imgWave.setImageResource(R.drawable.n_wavesel); final ImageButton imgWind= (ImageButton) rootView.findViewById(R.id.n_wind); h_Images.put("n_wind", imgWind); imgWind.setImageResource(R.drawable.n_windsel); final ImageButton imgFire= (ImageButton) rootView.findViewById(R.id.n_fire); h_Images.put("n_fire", imgFire); imgFire.setImageResource(R.drawable.n_firesel); final ImageButton imgTree= (ImageButton) rootView.findViewById(R.id.n_tree); h_Images.put("n_tree", imgTree); imgTree.setImageResource(R.drawable.n_treesel); final ImageButton imgStorm= (ImageButton) rootView.findViewById(R.id.n_storm); h_Images.put("n_storm", imgStorm); imgStorm.setImageResource(R.drawable.n_stormsel); final ImageButton imgDrop= (ImageButton) rootView.findViewById(R.id.n_drop); h_Images.put("n_drop", imgDrop); imgDrop.setImageResource(R.drawable.n_dropsel); final ImageButton imgDeepSea= (ImageButton) rootView.findViewById(R.id.n_deepsea); h_Images.put("n_deepsea", imgDeepSea); imgDeepSea.setImageResource(R.drawable.n_deepseasel); return rootView; } private boolean isNetworkAvailable(){ Context context=ApplicationManager.getAppContext(); ConnectivityManager connectivityManager= (ConnectivityManager) context.getSystemService(context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo= connectivityManager.getActiveNetworkInfo(); return activeNetworkInfo != null && activeNetworkInfo.isConnected(); } public void changeImageStatus(String sound, int imgId){ Log.d("Naturing", "FragmentNature::changeImageStatus | sound= " + sound + " imgId=" + imgId); h_Images.get(sound).setImageResource(imgId); } 

    }

    Le problème est que lorsque l'orientation change, la disposition MainActivity est correctement chargée, mais le viewPager n'est pas. En fait, il disparaît et rien ne peut être vu à sa place. Quoi qu'il en soit, le viewPager est là, car je peux le traverser et atteindre la fin (je le sais parce que je peux voir le signe bleu lorsque vous arrivez à la fin d'un menu).

    J'ai également essayé d'appeler la méthode OncreateView des fragments, mais rien ne change.

    Une idée? Merci et salutations

    EDITER 1

    Si je retire "pager.setOffscreenPageLimit (2);", après l'orientation, le fragment 1 et le fragment 3 sont visibles lorsque je défile le programme de visualisation pendant un certain temps, mais le fragment 2 n'apparaît en aucun cas. Je sais que ce n'est pas beaucoup, mais dans le cas où cela donne un indice à n'importe qui.

    EDIT 2

    Si je supprime la ligne dans le Manifeste, cela fonctionne comme il appelle onCreateView de MainActivity and Fragment. Mais j'ai besoin de la ligne dans le manifeste.

  • Affichage Web clignote / clignote pendant le défilement
  • Comment accéder aux fichiers depuis le dossier des ressources lors de l'exécution des tests?
  • Trouver le nom du package pour les applications Android pour utiliser Intent pour lancer l'application Market depuis le Web
  • Détection de glissement pour chaque ligne de liste
  • Android getIdentifier ne fonctionne pas pour la chaîne?
  • Impossible de créer un projet de bibliothèque Bintray Gradle - ClassNotFoundException
  • One Solution collect form web for “Fragments à l'intérieur de ViewPager disparaissent lorsque l'orientation change”

    À la fin, je l'ai fait avec DialogFragments, car je devais aller de l'avant. Quoi qu'il en soit, ce serait bien si quelqu'un sait quelque chose sur la façon de surmonter le problème de la manière dont j'ai expliqué dans la question pour les développements futurs.

    Merci

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.