方向变化的背景和碎片

时间:2012-07-13 09:32:20

标签: android

我正在使用Fragment兼容包。

在onAttach的片段中,我保留了Context引用。

public void onAttach(Activity activity) {
    super.onAttach(activity);
    Log.w(logTag, "Activity is: " + activity);
    mContext = activity;
    Log.w(logTag, "mContext is: " + mContext); // <-- Breakpoint here
}

稍后,我使用上下文

private String loadExampleSuccessXML () {
    try {
        AssetManager assets = this.mContext.getAssets(); // <-- Breakpoint here
        //Other Stuff

当我更改方向时,onAttach似乎存储新的上下文,但当我到达loadExampleSuccessXML时,mContext为空。

我在onAttach和mContext保存mContext.getAsssets()后有断点。

当我第一次运行应用程序时,调试器显示mContext的值:

onAttach(), mContext [MyActivity] (id=830010419632)

loadExampleSuccessXML(), mContext [MyActivity] (id=830010419632)

然后在配置更改后

onAttach(), mContext [MyActivity] (id=830010565472)

loadExampleSuccessXML(), mContext null

我无法理解为什么。任何帮助都会很棒。

2 个答案:

答案 0 :(得分:1)

根据我的经验,你应该处理方向改变:

<activity
    android:name="com..."
    android:configChanges="orientation|keyboardHidden" />

参考文献:

答案 1 :(得分:1)

您是否可以提供一些更详细的信息,说明为什么需要维护对上下文的引用?这至少对我们的应用程序来说从来都不是必需的,并且已经显示(尽管不是在您发布的代码的情况下)是Android内存泄漏的主要罪魁祸首...

如果您需要维护上一个活动状态的某个方面,那么我建议您使用onSavedInstanceState()。在这里,您可以传递一些简单的属性(例如我最后在列表中选择的项目的ID)。 Manifest配置修复通常是错误的方法,尽管它在诸如此类的帮助站点上很普遍。你可能不希望这样。

最后,再次考虑使用setRetainInstance(true) ......根据我们的经验,如果使用不当,这是非常危险的方法!这可能只是我们,但它至少对最近的android.support.v4.*库有一些错误。当设置为true时,这确保片段永远不会被销毁(即onDestroy()被调用),但是简单地附加和分离,因为在循环中销毁了欠活动并重新创建。它会对你的问题进行排序,但确实阅读了有关它的用法的文档......一些副作用非常微妙。