2

片段空这里是我的设置:为什么里面onActivityResult

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

从片段1我发动DialogFragment,然后从DialogFragment我启动activityForResult一个隐含的相机意图进行拍照。

问题:

有时,从我的摄像头应用程序崩溃返回片段1的onActivityResult内部时。为什么会发生?现在了解onActivityResult的回调链。它将按照Activity.onActivityResult -> FragmentWithPages.onActivityResult -> Fragment1.onActivityResult -> DialogFragment.onActivityResult的顺序返回。所以我的问题是,当我做mDialogFragment.onActivityResult(…)时,为什么DialogFragment为空?

我想它可能与内存有关:系统杀死我的应用程序,然后在相机应用程序返回后重新启动它。但是,如果是这样的话,为什么DialogFragment链中断链?我能做些什么来防止这个问题或处理它,就像没有什么问题一样?

因此,不,我不是故意单纯地抓住NPE,这并没有太大的作用,因为它会使我拍摄照片的全部目的失效。

+1

只需使用findFragmentByTag或类似的方法更新对话框片段的引用即可。 – dtx12

+0

这实际上可能会这样做,但仍然很难测试,因为它只是有时会发生。加一个帮助。谢谢! –

回答

1

当您从startActivityForResult()返回时,不能保证活动实例是相同的。系统可以自由处理为结果而开始的活动,并重构它以处理onActivityResult()呼叫。

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

您可以通过在设备的开发人员设置中设置“不要保留活动”来测试此方案。

1

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

@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

+0

感谢您复制我写的内容。总是很好有2个相同的答案。 –

相关问题