恢复片段中的EditText输入

时间:2014-08-11 10:52:42

标签: android android-fragments

我有一个片段活动。片段会增加这样的活动,具体取决于一些数据:

@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的字段?

3 个答案:

答案 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()方法。