9

当应用程序启动时,我有一个ViewPager由 a 填充的:FragmentStatePagerAdapter

    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
    }

这可以正常工作。

现在,当用户更改应用程序的设置时,我想为 ViewPager 分配一个新的适配器,如下所示:

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

updateObserver不幸的是,应用程序在调用此异常后崩溃:

01-22 23:22:45.957:​​E/AndroidRuntime(13131):致命异常:主要 01-22 23:22:45.957:​​E/AndroidRuntime(13131):java.lang.IllegalStateException:密钥 f0 的片段不再存在:索引 0 01-22 23:22:45.957: E/AndroidRuntime(13131): 在 android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:575) 01-22 23:22:45.957: E/AndroidRuntime( 13131): 在 android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:211) 01-22 23:22:45.957: E/AndroidRuntime(13131): 在 android.support.v4.view.ViewPager.onRestoreInstanceState (ViewPager.java:1281) 01-22 23:22:45.957: E/AndroidRuntime(13131): 在 android.view.View.dispatchRestoreInstanceState(View.java:13188) 01-22 23:22:45.957: E/AndroidRuntime (13131): 在 android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2850) 01-22 23:22:45.957: E/AndroidRuntime(13131): 在 android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2856) 01-22 23:22:45.957: E/AndroidRuntime(13131): 在android.view.View.restoreHierarchyState(View.java:13166) 01-22 23:22:45.957: E/AndroidRuntime(13131): 在 android.support.v4.app.Fragment.restoreViewState(Fragment.java:425) 。 ..

如何在ViewPager不崩溃应用程序的情况下将新适配器分配给?

4

2 回答 2

2

使用 getFragmentManager() 而不是 getChildFragmentManager()。

于 2016-05-11T14:19:02.417 回答
1

你检查过这个线程吗? java.lang.IllegalStateException: 键 f1: index 3 的片段不再存在 。如果您在应用程序从后台返回时不关心 Fragment 的状态恢复,请使用FragmentPagerAdapter而不是。FragmentStatePagerAdapter

于 2015-04-22T08:48:49.823 回答