【问题标题】:App crashes when assigning new adapter to my ViewPager将新适配器分配给我的 ViewPager 时应用程序崩溃
【发布时间】:2014-02-13 05:55:02
【问题描述】:

我有一个ViewPager,在应用启动时由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 分配一个新的适配器而不会使应用程序崩溃?

【问题讨论】:

标签: android fragmentstatepageradapter


【解决方案1】:

使用 getFragmentManager() 代替 getChildFragmentManager()。

【讨论】:

    【解决方案2】:

    你检查过这个帖子吗? java.lang.IllegalStateException: Fragement no longer exists for key f1: index 3 .如果您不关心应用从后台返回时 Fragment 的状态恢复,请使用 FragmentPagerAdapter 而不是 FragmentStatePagerAdapter

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-20
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      • 2014-03-31
      相关资源
      最近更新 更多