关于片段生命周期,何时调用片段的 onActivityResult?

Posted

技术标签:

【中文标题】关于片段生命周期,何时调用片段的 onActivityResult?【英文标题】:When is fragment's onActivityResult called in respect to fragments lifecycle? 【发布时间】:2012-11-21 00:07:34 【问题描述】:

当我启动Camera 意图时,我注意到onActivityResultfragment 生命周期中的onResume 之前被调用。

我还注意到onActivityResultonStart 之后被调用。

但这是奇怪的部分:我有变量 fileUri == “一些图像路径”。 这个变量是

onStart 中不为 NULL。 onActivityResult 中的NULL 在 onResume 中再次不为 NULL

查看 logCat

12-03 14:39:42.418: D/Fragment1(29220): onStart fileUri: file:///mnt/sdcard/OPS_IMAGES/IMG_20121203_143933.jpg
12-03 14:39:42.463: W/PhoneWindow(29220): Previously focused view reported id 2131034140 during save, but can't be found during restore.
12-03 14:39:42.463: D/Fragment1(29220): onActivityResult fileUri is NULL!!!
12-03 14:39:42.468: D/Fragment1(29220): onResume fileUri: file:///mnt/sdcard/OPS_IMAGES/IMG_20121203_143933.jpg

最糟糕的是,这种情况只发生在 50% 的时间里。另外 50% onActivityResult 可以毫无问题地访问 fileUri 值...

我应该如何调试这个?

注意:为了简单起见,我没有包含我的 onResume、onStart、onActivityResult 方法的代码。它们只是具有变量检查和日志调用的基本方法。如果需要,我将编辑问题并添加这些方法。

注意 2:我正在使用 google 支持库来支持旧 API 版本上的片段。

【问题讨论】:

你解决这个问题了吗? 它们是否可能是同一 Fragment1 类的不同实例?在日志中添加System.identityHashCode(this) 以打印出每个实例的标识符 【参考方案1】:

为了回答您最初的问题,这是生命周期回调的顺序

12-09 16:38:41.800 10227-10227/org.Test I/Fragment: ## OnStart()
12-09 16:38:41.820 10227-10227/org.Test I/Fragment: ## OnActivityResult()
12-09 16:38:41.821 10227-10227/org.Test I/Fragment: ## OnResume()

【讨论】:

【参考方案2】:

这不是我一直在修补的领域或我遇到的问题,但是如果您的变量由于某种原因不可见...您是否尝试过使用不同类型的方式来引用该值?

我的建议是尝试使用 SharedPreferences 变量并将值保存在编辑器中并将其拉回。这可能不是最好的解决方案,但目前可能是一种解决方法。

我从 logcat 收到了类似的错误消息,这就是我偶然发现您的帖子的原因。

"01-27 11:13:42.899: W/PhoneWindow(1591): Previously focused view reported id 16908862 during save, but can't be found during restore."

我能够解决我的问题的方法是我的“空白构造函数”没有重新实例化我的片段。在片段中,我只有 1 个变量是“ID”,当用户选择带有他们选择的项目时,它会传递回我的活动。我只是通过使用传入的值调用我的普通构造函数来重新实例化我的片段。

例如。

public UIDialogFragmentVolume() 
    this(ID);


public UIDialogFragmentVolume(int typeID) 
    ID = typeID;

我希望这可以帮助您确定并解决您的问题。

【讨论】:

以上是关于关于片段生命周期,何时调用片段的 onActivityResult?的主要内容,如果未能解决你的问题,请参考以下文章

关于片段生命周期

理解片段事务期间片段的生命周期方法调用

如何知道片段何时在 viewpager 中实际可见

调用 replace() 时片段的生命周期是啥?

在不存在的片段上调用片段生命周期和 onCreate 的问题

我应该在 Fragment 中的啥生命周期状态下执行异步任务?