【发布时间】:2016-12-18 21:32:18
【问题描述】:
所以我有一个附加到活动的片段,我试图确保在屏幕旋转时事情顺利进行(或任何会中断活动的事情)。为此,我在我的活动中使用了 onSaveInstanceState 和 onRestoreInstanceState 方法来保存我的活动存储的信息。
当我的片段的视图被创建时,片段向 Activity 询问信息(这是片段的 onCreateView() ):
ArrayList<String> picList = mListener.getPics();
ArrayList<String> descripList = mListener.getDescriptions();
为了让片段创建视图,它需要访问 picList 和 descripList,它们是活动的成员变量。这些成员变量在 onSaveInstanceState 和 onRestoreInstanceState 中存储和恢复。
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if(photoFile != null)
outState.putString("photoFile", photoFile.getAbsolutePath());
outState.putString("currentFragTag", currentFragTag);
outState.putStringArrayList("picList", picList);
outState.putStringArrayList("descripList", descripList);
}
@Override
protected void onRestoreInstanceState(Bundle saved) {
super.onRestoreInstanceState(saved);
if(saved.getString("photoFile") != null)
photoFile = new File(saved.getString("photoFile"));
currentFragTag = saved.getString("currentFragTag");
picList = saved.getStringArrayList("picList");
descripList = saved.getStringArrayList("descripList");
currentFrag = getFragmentManager().findFragmentByTag(currentFragTag);
changeFrag(currentFrag, currentFragTag);
}
问题是,在活动中调用 onRestoreInstanceState() 之前调用了 onCreateView()。我尝试在片段中使用 onActivityCreated(),但这也是在 onRestoreInstanceState() 之前调用的。附加调试器后,当屏幕旋转时,始终最后调用 onRestoreInstanceState()。这意味着片段在创建视图时无法访问活动的信息。
这应该发生吗?恢复 Activity 时,如何让 Fragment 的视图使用来自 Activity 的信息?
【问题讨论】:
-
您是否将 Fragment 设置为
setRetainInstance(true)? -
我没有。那会带来什么?我快速搜索了一下,发现不能用于 back stack 上的 Fragments,会出现问题。
-
它需要在创建 Fragment 实例时简单地调用该方法。我不完全确定它的作用,但这是保留片段状态的一种方式。也许你可以参考这里? stackoverflow.com/questions/15313598/…