【问题标题】:Fragment saves previous state but it doesn't restore correctly片段保存以前的状态,但不能正确恢复
【发布时间】:2018-12-02 14:10:37
【问题描述】:

我有一个像这样在 onCreate 中加载片段的活动:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    loadFragment(new FragmentName());
}

private void loadFragment(Fragment fragment) {
    FragmentManager fm = getFragmentManager();
    FragmentTransaction fragmentTransaction = fm.beginTransaction();
    // replace the FrameLayout with new Fragment
    fragmentTransaction.replace(R.id.frag_lay, fragment);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}

我正在尝试保存和恢复加载的片段的状态,如下所示:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    if (savedInstanceState != null) {
        spinner.setSelection(savedInstanceState.getInt("spinner"));
    }
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putInt("spinner", spinner.getSelectedItemPosition());
}

发生的情况是我正确存储了微调器的位置,但无论如何都会重新创建微调器,并且它的位置是默认位置,即使我选择了保存的位置。 我不确定为什么会发生这种情况,有人可以帮忙吗?

编辑

我在这里设置微调器:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    view = inflater.inflate(R.layout.fragment_campus, container, false);

    ...
    setupSpinner();
    return view;
}

private void setupSpinner() {
    ArrayAdapter<CharSequence> adapter = 
              ArrayAdapter.createFromResource(this.getActivity(),
                        R.array.array_spinner, 
                            android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter)
}

编辑 2

我又做了一些尝试。我举了一些祝酒词来展示这样发生的事情:

public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    if (savedInstanceState != null) {
        Toast toast = Toast.makeText(getActivity(), "saved !=", Toast.LENGTH_SHORT);
        toast.show();
    }else{
        Toast toast = Toast.makeText(getActivity(), "saved ==", Toast.LENGTH_SHORT);
        toast.show();
    }
}

当我尝试在模拟器上运行此代码时,会发生这种情况:当我第一次启动应用程序时,它会进入 else 语句(应该是正确的)。当我改变方向时,两个 toast 都会显示(显然我首先在 onSaveInstanceState 中保存了一些东西),这是不对的。为什么会这样?

【问题讨论】:

  • 微调器的位置在哪里选择?
  • 在 onCreateView 中,我将微调器设置为默认位置,并尝试在 onActivityCreated 中将其恢复,并将其保存。
  • 你能展示一下吗?
  • 给你,我编辑了答案!我什至没有设置选择,我只是在数组资源中的一个数组上设置适配器。

标签: android android-fragments android-savedstate fragment-lifecycle


【解决方案1】:

在您的活动中更改此行:

loadFragment(new FragmentName());

到这里:

if (savedInstanceState == null) {
    loadFragment(new FragmentName());
}

FragmentManager 会自动为您保存和恢复 Activity 中的片段,作为保存和恢复这些片段状态的同一过程的一部分。但是,现在,每次重新创建活动时,您都会丢弃旧片段并用新片段替换它。

【讨论】:

  • 没错,这就是发生这种情况的原因!添加了这个条件并解决了我的问题。
猜你喜欢
  • 2013-04-04
  • 2014-04-25
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多