在尝试恢复我的碎片时,我的
Android应用程序崩溃了.我没有向我正在尝试恢复的捆绑包添加任何自定义变量,这都是默认值.我正在使用Fragments和ViewPager.请参阅下面的代码段:
public static class MyAdapter extends FragmentStatePagerAdapter { public MyAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return NUM_ITEMS; } public int getCurrentItemPosition(Fragment fragment){ return getItemPosition(fragment); } @Override public Fragment getItem(int position) { return ContentFragment.newInstance(position); } } public class MyActivity extends FragmentActivity { static final int NUM_ITEMS = 100000; public int currentSelectedPage; private int changeToFragmentIndex; public DateTime midDate; MyAdapter mAdapter; ViewPager mPager; /** Called when the activity is first created. */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.diary); MyApplication application = (MyApplication)getApplication(); application.dataController.myActivity = this; mAdapter = new MyAdapter(getSupportFragmentManager()); mPager = (ViewPager)findViewById(R.id.pager); mPager.setAdapter(mAdapter); int newDay = application.daysBetween(DateTime.now(),DateTime.parse(application.day.dateToShortString())); this.currentSelectedPage = NUM_ITEMS/2+newDay; mPager.setCurrentItem(NUM_ITEMS/2+newDay); mPager.setOnPageChangeListener(new SimpleOnPageChangeListener(){ public void onPageSelected(int position){ currentSelectedPage = position; ContentFragment fragment = (ContentFragment) mAdapter.instantiateItem(mPager,currentSelectedPage); fragment.loadData(); } }); } } public class ContentFragment extends Fragment { private View v; static final int NUM_ITEMS = 100000; static ContentFragment newInstance(int num) { ContentFragment f = new ContentFragment(); return f; } @Override public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) { if (container == null) return null; v = inflater.inflate(R.layout.diarycontent,container,false); return v; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } @Override public void onSaveInstanceState(Bundle savedInstanceState){ super.onSaveInstanceState(savedInstanceState); setUserVisibleHint(true); } }
我收到这个stackstrace:
Caused by: java.lang.NullPointerException at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:519) at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:1 55) at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:522)
据我所知,这可能是支持包的一个已知问题,一个可能的解决方案是在onSaveInstanceState中使用setUserVisibleHint(true).但这没有帮助.
有谁知道问题的另一个解决方案或我做错了什么?
解决方法
一旦我开始在Tab中使用带有FragmentStatePagerAdapter的ViewPager,我就遇到了同样的问题.
然后我玩了与这个问题相关的所有论坛,并打破了我的头两天,找出为什么发生这个问题以及如何解决它,但没有找到任何满足我的要求的完美解决方案.
我得到了解决方案,以避免NPE崩溃使用FragmentPagerAdapter而不是FragmentStatePagerAdapter.当我替换FragmentPagerAdapter而不是FragmentStatePagerAdapter然后没有遇到NPE崩溃问题但是同一页面本身没有刷新以进行进一步导航(这是我的要求).
最后覆盖FragmentStatePagerAdapter上的saveState方法,一切正常工作.
@Override public Parcelable saveState() { // Do Nothing return null; }
我如何轻松地重现这个问题:
我使用更高版本(4.1)设备并按照以下步骤操作:
1.转到设置 – >开发者选项.
2.单击“不要保留活动”选项.
现在我玩我的应用程序.
每次应用程序因android.support.v4.app.FragmentManagerImpl.getFragment(未知来源)中的NPE而崩溃时覆盖saveState()方法.但是在覆盖saveState()之后没有注册崩溃.
我希望通过这样做你不会有任何问题.