这是我的设置:
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,这并没有真正做多,因为它会使我拍摄照片的整个目的无效。
答案 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