Android 应用程序在使用 Fragments 和 ViewPager 一段时间后崩溃

标签 android crash fragment android-viewpager

我遇到了一个问题,我的 Android 应用程序在尝试恢复我的 fragment 时崩溃了。我没有向要恢复的包中添加任何自定义变量,这都是默认设置。我正在使用 fragment 和 ViewPager。请参阅下面的代码 fragment :

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 中使用带有 FragmentStatePagerAdapter 的 ViewPager 时,我遇到了同样类型的问题。

然后我在所有与此问题相关的论坛上玩了两天,以找出发生此问题的原因以及如何解决它,但没有找到满足我要求的完美解决方案。

我得到了解决方案,因为为了避免 NPE 崩溃,使用 FragmentPagerAdapter 而不是 FragmentStatePagerAdapter。当我替换 FragmentPagerAdapter 而不是 FragmentStatePagerAdapter 时,没有遇到 NPE 崩溃问题,但同一页面不会自行刷新以进行进一步导航(这是我的要求)。

最后覆盖 FragmentStatePagerAdapter 上的 saveState 方法,一切都按预期正常工作。

@Override
public Parcelable saveState() {
    // Do Nothing
    return null;
}


我如何轻松重现此问题:
我正在使用更高版本 (4.1) 的设备并按照以下步骤操作:
1. 前往设置 -> 开发者选项。
2. 点击选项“不保留 Activity ”。

现在我开始玩我的应用了。

在每次应用程序因 android.support.v4.app.FragmentManagerImpl.getFragment(Unknown Source) 处的 NPE 而崩溃时覆盖 saveState() 方法之前。但是在重写 saveState() 之后没有注册崩溃。

我希望这样做不会有任何问题。

关于Android 应用程序在使用 Fragments 和 ViewPager 一段时间后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11097091/

相关文章:

java - 无法将上下文转换为 fragment 的 FragmentAdapter 中的 CustomCallBack 接口(interface)

android - ICS 是否支持 android.app.Fragment?

android - 如何在操作栏选项卡中以编程方式更改选定的选项卡指示器颜色

java - Android,实时振幅和音调检测

java - 错误: Invalid start tag LinearLayout

windows - Powershell ISE 崩溃时在哪里存储选项卡?

Emacs:如何使用保存列表从崩溃中恢复缓冲区?

android - 将对象传递给 fragment

android - 从 SQLite 切换到 Firebase?

android - 新 Activity 崩溃