为什么Fragment null在onActivityResult中

时间:2015-12-18 00:11:47

标签: android android-fragments onactivityresult activity-lifecycle

这是我的设置:

Activity -> FragmentWithPages -> ViewPager{Fragment1, Fragment2}

从Fragment1开始我启动一个DialogFragment,然后从DialogFragment启动activityForResult,以获取隐含的相机意图拍照。

问题:

有时,从相机返回时,我的应用程序在Fragment1的onActivityResult内崩溃。为什么会这样?现在了解onActivityResult的回调链。它会以Activity.onActivityResult -> FragmentWithPages.onActivityResult -> Fragment1.onActivityResult -> DialogFragment.onActivityResult的顺序返回。所以我的问题是,当我DialogFragment时,为什么mDialogFragment.onActivityResult(…)为空?

我想它可能与内存有关:系统会杀死我的应用程序,然后在Camera应用程序返回后重新启动它。但如果是这种情况,为什么DialogFragment链中的链接断了?我该怎么做才能防止出现这个问题,或者像没有出错一样处理它?<​​/ p>

所以不,我不是故意只是去捕捉NPE,这并没有真正做多,因为它会使我拍摄照片的整个目的无效。

2 个答案:

答案 0 :(得分:1)

当您从startActivityForResult()返回时,无法保证活动实例将是相同的。系统可以自由处理为结果启动的活动,并重建它以处理onActivityResult()调用。

如果发生这种情况,这当然意味着您先前分配的任何实例字段将不再如此。您可以使用onSaveInstanceState()并使用传递到Bundle的已保存实例状态onCreate()重新构建活动实例。

您可以通过设置&#34;不要保持活动&#34;来测试这种情况。在您设备的开发者设置中。

答案 1 :(得分:1)

这是一种常见的情况,系统会因为需要更多资源而破坏您的活动。您需要实现 onSaveInstanceState 方法,然后在 onCreate onRestoreInstanceState 方法中恢复实例状态。

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putExtra("yourData", yourParcelableData);
}


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // keep the fragment and all its data across screen rotation
    setRetainInstance(true);
    if(savedInstanceState != null){
        yourParcelableData = (yourParcelableData)savedInstanceState.getExtra("yourData");
    }

}

有一个库可以让您更轻松地完成。 https://github.com/frankiesardo/icepick

相关问题