NullPointerException lors de la présentation d'un ViewPager une deuxième fois

J'utilise un fragment ViewPager qui comporte deux fragments comme enfants. Cela fonctionne très bien, cependant, lorsque je remplace le fragment ViewPager par un autre fragment et que je remplace ce fragment par le fragment ViewPager ma demande se bloque avec NullPointerException suivante:

 java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:667) at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:211) at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1319) at android.view.View.dispatchRestoreInstanceState(View.java:13756) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2888) at android.view.View.restoreHierarchyState(View.java:13734) at android.support.v4.app.Fragment.restoreViewState(Fragment.java:468) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1094) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613) at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5294) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) 

Mon fragment ViewPager compose du code source suivant qui implante les deux fragments enfants au cas où ils seraient nuls. De plus, l'implémentation ViewPagerAdapter est instanciée et affectée au ViewPager .

  • Appareil LG non répertorié dans les périphériques ADB
  • API de synchronisation Dropbox - erreur de lien insatisfaisante
  • Récupérer un ListView en utilisant un ArrayList?
  • Ajout de plugins de projet de révision spécifique Github au projet Cordova
  • Problèmes liés aux dernières jarres de Square - rétrofit, okhttp, okio et okhttp-urlconnection
  • Supprimez l'ombre sous TabLayout sur Android
  •  public class ConnectionPasswordViewPagerFragment extends Fragment { private ViewPager vpConnectionPassword; private ConnectionPasswordViewPagerAdapter paConnectionPassword; private ConnectionPasswordGeneratorMACAddress passwordGeneratorMACAddress; private ConnectionPasswordGeneratorSerialNumber passwordGeneratorSerialNumber; public ConnectionPasswordViewPagerFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if ((this.passwordGeneratorSerialNumber == null) && (this.passwordGeneratorMACAddress == null)) { this.passwordGeneratorMACAddress = new ConnectionPasswordGeneratorMACAddress(); this.passwordGeneratorSerialNumber = new ConnectionPasswordGeneratorSerialNumber(); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_connection_password_view_pager, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); /*if (this.paConnectionPassword == null) {*/ this.paConnectionPassword = new ConnectionPasswordViewPagerAdapter(this.getChildFragmentManager(), this.getActivity(), this.passwordGeneratorMACAddress, this.passwordGeneratorSerialNumber); //} this.vpConnectionPassword = (ViewPager) this.getActivity().findViewById(R.id.vpConnectionPassword); this.vpConnectionPassword.setAdapter(this.paConnectionPassword); } } 

    Le ViewPagerAdapter montré ci-dessous la mise en œuvre conserve la référence aux fragments enfants dans une ArrayList et implémente les méthodes getItem() , getCount() ainsi que getPageTitle() . La classe ViewPagerFragment étend simplement la classe Fragment support et fournit la méthode abstraite getPageTitleStringID() implémentée par les fragments enfants.

     public class ConnectionPasswordViewPagerAdapter extends FragmentStatePagerAdapter { private static final byte NUMBER_OF_FRAGMENTS = (byte) 2; private ArrayList<ViewPagerFragment> childFragments; private Activity displayActivity; public ConnectionPasswordViewPagerAdapter(FragmentManager fragmentMgm, Activity displayAct, ConnectionPasswordGeneratorMACAddress generatorMACAddress, ConnectionPasswordGeneratorSerialNumber generatorSerialNumber) { super(fragmentMgm); this.childFragments = new ArrayList<>(ConnectionPasswordViewPagerAdapter.NUMBER_OF_FRAGMENTS); this.setDisplayActivity(displayAct); if (generatorMACAddress != null) { this.childFragments.add(generatorMACAddress); } if (generatorSerialNumber != null) { this.childFragments.add(generatorSerialNumber); } } public Activity getDisplayActivity() { return this.displayActivity; } public void setDisplayActivity(Activity value) { this.displayActivity = value; } @Override public Fragment getItem(int position) { return this.childFragments.get(position); } @Override public int getCount() { return ConnectionPasswordViewPagerAdapter.NUMBER_OF_FRAGMENTS; } @Override public CharSequence getPageTitle(int position) { return this.getDisplayActivity().getString(this.childFragments.get(position).getPageTitleStringID()); } } 

    Merci de votre aide!

  • Est-il possible d'enregistrer des appels téléphoniques via une application Android?
  • Comment obtenir FusedLocation à partir de IntentService
  • Version minimale des services Google Play pour la notification Push
  • Android équivalent de getActivity () de / in ActionBarActivity
  • Play Store dit que mon téléphone ne prend pas en charge ma propre application?
  • Pouvez-vous lancer l'application d'appareil photo natif à partir d'une application Web Html 5?
  • 3 Solutions collect form web for “NullPointerException lors de la présentation d'un ViewPager une deuxième fois”

    J'ai réparé le problème en créant simplement le fragment contenant le pager de vue chaque fois que j'appelle la méthode de replace du gestionnaire de fragments de support.

     public void onSwitchToConnectionPasswordGenerator(View clickedView) { this.fragConnectionPassword = new ConnectionPasswordViewPagerFragment(); this.getSupportFragmentManager().beginTransaction().replace(R.id.flFragmentContainer, this.fragConnectionPassword).commitAllowingStateLoss(); } 

    Je pense que votre Viewpager est en Fragment, et ce fragment a défini settreeInstance sur true (j'ai aussi cette erreur lorsque j'essaie de conserver le fragment parent)

    Le meilleur moyen est que vous pouvez vérifier si FragmentManager a obtenu Fragment s'il existe, sinon créez une nouvelle instance comme suit:

     FragmentManager manager = getSupportFragmentManager(); Fragment fragment = manager.findFragmentByTag("YourFragmentName"); if(fragment == null) fragment = new YourFragment(); FragmentTransaction fragmentTransaction = manager.beginTransaction(); fragmentTransaction.replace(Your_Fragmnet_Container_Layout_id, fragment, fragment.getClass().getSimpleName()); fragmentTransaction.commit; 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.