9

I have a ViewPager which is populated by a FragmentStatePagerAdapter when the app starts:

    ViewPager mViewPager;

    ...

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) 
    {
        super.onViewCreated(view, savedInstanceState);

        mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
        mViewPager.setAdapter(new PageAdapter(getChildFragmentManager()));
        //PageAdapter extends from FragmentStatePagerAdapter
    }

This works fine as it should.

Now, when the user changes the settings of the app I'd like to assign a new Adapter to the ViewPager like this:

@Override
public void updateObserver(SETTING_KEY key) 
{
    mViewPager.setAdapter(new PageAdapter(getChildFragmentManager()));
    Log.d("info", "updating");
}

Unfortunately the app crashes after calling updateObserver with this exception:

01-22 23:22:45.957: E/AndroidRuntime(13131): FATAL EXCEPTION: main 01-22 23:22:45.957: E/AndroidRuntime(13131): java.lang.IllegalStateException: Fragement no longer exists for key f0: index 0 01-22 23:22:45.957: E/AndroidRuntime(13131): at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:575) 01-22 23:22:45.957: E/AndroidRuntime(13131): at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:211) 01-22 23:22:45.957: E/AndroidRuntime(13131): at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1281) 01-22 23:22:45.957: E/AndroidRuntime(13131): at android.view.View.dispatchRestoreInstanceState(View.java:13188) 01-22 23:22:45.957: E/AndroidRuntime(13131): at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2850) 01-22 23:22:45.957: E/AndroidRuntime(13131): at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2856) 01-22 23:22:45.957: E/AndroidRuntime(13131): at android.view.View.restoreHierarchyState(View.java:13166) 01-22 23:22:45.957: E/AndroidRuntime(13131): at android.support.v4.app.Fragment.restoreViewState(Fragment.java:425) ...

How do I assign an new Adapter to the ViewPager without crashing the app?

user1567896
  • 2,278
  • 2
  • 23
  • 43
  • 1
    Have you tried this? http://stackoverflow.com/questions/12783571/android-viewpager-change-adapter Edit: I see this is from one year ago. – Peter Feb 09 '15 at 20:54

2 Answers2

2

Use getFragmentManager() instead of getChildFragmentManager().

Basic Coder
  • 9,053
  • 5
  • 39
  • 71
1

Have you check this thread ? java.lang.IllegalStateException: Fragement no longer exists for key f1: index 3 . Use FragmentPagerAdapter instead of FragmentStatePagerAdapter if you dont care about the Fragment's state restoring when you app go back from background.

Community
  • 1
  • 1
jobcrazy
  • 983
  • 7
  • 16