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?
ViewPager2 is an improved version of the ViewPager library that offers enhanced functionality and addresses common difficulties with using ViewPager . If your app already uses ViewPager , read this page to learn more about migrating to ViewPager2 .
ViewPager2 uses FragmentStateAdapter objects as a supply for new pages to display, so the FragmentStateAdapter will use the fragment class that you created earlier. Create an activity that does the following things: Sets the content view to be the layout with the ViewPager2 .
You can use startActivityForResult(or broadcast/receiver) to get the result from the activity. Then use adapter. notifyDataSetChanged to refresh the fragment.
Use getFragmentManager() instead of getChildFragmentManager().
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With