当我尝试恢复我的片段时,我的 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);
}
}
我收到这个堆栈跟踪:
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 中使用 ViewPager 和 FragmentStatePagerAdapter 时,我遇到了同样类型的问题。
然后我玩遍了与此问题相关的所有论坛,花了两天时间找出这个问题发生的原因以及如何解决它,但没有找到任何满足我要求的完美解决方案。
我得到的解决方案是为了避免 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() 后,没有发生崩溃。
我希望这样做您不会遇到任何问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)