我有一个片段活动。片段会增加这样的活动,具体取决于一些数据:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
switch (someId) {
case 1:
mFragment = new Fragment1();
break;
case 2:
mFragment = new Fragment2();
break;
}
}
if (savedInstanceState != null) {
Log.e("onSaveInstanceState Activity", "not null");
mFragment = getFragmentManager().getFragment(savedInstanceState, "mFragment");
}
Bundle args = new Bundle();
args.putString(SOME_TEXT, "example text");
mFragment.setArguments(args);
if (savedInstanceState == null) {
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.content_frame, mFragment);
fragmentTransaction.commit();
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.e("onSaveInstanceState Activity", "onSave");
getFragmentManager().putFragment(outState, "mFragment", mFragment);
}
然后是片段(假设它们是相同的):
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final Activity activity = getActivity();
setRetainInstance(true);
Bundle in = getArguments();
String field1Text = in.getString(SOME_TEXT);
field1 = (EditText) activity.findViewById(R.id.field1);
if (savedInstanceState != null) {
Log.e("savedInstanceState", "not null");
field1.setText(savedInstanceState.getString("field1"));
} else {
Log.e("savedInstanceState", "null");
field1.setText(field1Text);
}
@Override
public void onSaveInstanceState(Bundle outState) {
Log.e("onSaveInstanceState", "onSave");
outState.putString("field1", field1.getText().toString());
super.onSaveInstanceState(outState);
}
所以我认为该片段会将其状态和setText恢复为EditText字段。
但是例如当我使用bundle的SOME_TEXT = "example text"
实例化片段时,然后在EditText的字段中将其更改为"some changes"
,然后我移动到其他应用程序(例如,当内存不足时导致我的应用关闭):
onSaveInstanceState onSave
被调用,但onSaveInstanceState Activity
不是。
当我再次打开它时,EditText中的文本为"example text"
,并且在日志中我有:
savedInstanceState not null
savedInstanceState null
(在我的情况下似乎onActivityCreated
被解雇了两次)
但onSaveInstanceState Activity not null
未被调用。
那么为什么这个文字不像我想要的那样。
我该如何恢复EditText的字段?
答案 0 :(得分:1)
在活动的onCreate()中,您必须调用super函数。重新附加SavedInstanceState中的片段。
请注意,重新附加后您正在执行第二个片段事务。您手动将已保存的片段从包中拉出并重新附加。你不需要这样做。
这就是问题所在,因为通过片段事务添加的片段将收到null savedInstanceState包。意味着片段在其onCreate()中没有任何状态可以实现。当savedInstanceState!= null时,您可以跳过onCreate中的任何片段事务。并确保也调用片段中的super.onCreate()。
答案 1 :(得分:0)
我希望我能发表评论,但这是我的建议: 你确定吗
内部调用savedInstanceState null
"首先"分段?我的意思是,你不是意外地创造了一个替代旧片段的片段吗?
答案 2 :(得分:0)
在超级调用之后的OnCreate()方法中,您需要添加
this.setRetainInstance(真);
这将允许片段保留状态,并应保存已经进行的任何更改。
同样在片段中,onCreate方法不是onCreate方法进行初始加载,而是onCreateView()方法。