我正在使用Fragment兼容性软件包。
在onAttach的Fragment中,我保留了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似乎存储了新的Context,但是当我进入
loadExampleSuccessXML
时,mContext
为null。在
mContext
保存在onAttach和mContext.getAsssets()
后,我有断点。当我第一次运行该应用程序时,调试器将显示mContext的值:
在
onAttach(), mContext [MyActivity] (id=830010419632)
中在
loadExampleSuccessXML(), mContext [MyActivity] (id=830010419632)
中但是然后在配置更改后
在
onAttach(), mContext [MyActivity] (id=830010565472)
中在
loadExampleSuccessXML(), mContext null
中我不明白为什么。任何帮助都会很棒。
最佳答案
您能否提供更多细节,说明为什么需要维护对上下文的引用?至少这从来不是我们的应用程序所必需的,并且已被证明(尽管不是您发布的代码)(是您的情况)是Android内存泄漏的罪魁祸首...
如果您需要保持先前活动状态的某个方面,那么我建议使用onSavedInstanceState()
。在这里,您可以通过一些简单的属性(例如,我上次在列表中选择的项的ID)。清单配置修复通常是错误的方法,尽管它在这样的帮助站点上很普遍。您可能不想要那样。
最后,再次尝试使用setRetainInstance(true)
...,根据我们的经验,如果使用不当,这将是非常危险的方法!那可能只是我们,但是至少在最近的android.support.v4.*
库中确实存在一些错误。设置为true
时,这可确保该片段永不销毁(即调用onDestroy()
),但由于旋转时销毁了所欠活动并重新创建了该片段,因此可以简单地对其进行附着和分离。它将解决您的问题,但是请仔细阅读有关其用法的文档...某些副作用非常微妙。
关于android - 方向变化的背景和 fragment ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11467796/