片段保存以前的状态,但不能正确恢复
Fragment saves previous state but it doesn't restore correctly
我有一个像这样在 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 语句(应该是正确的)。当我改变方向时,两个 toasts 都会显示(显然我首先在 onSaveInstanceState 中保存了一些东西),这是不对的。为什么会这样?
在 activity 中更改此行:
loadFragment(new FragmentName());
对此:
if (savedInstanceState == null) {
loadFragment(new FragmentName());
}
FragmentManager 将自动为您保存和恢复 activity 中的片段,作为保存和恢复这些片段状态的同一过程的一部分。但是现在,每次重新创建 activity 时,您都会丢弃旧片段并用新片段替换它。
我有一个像这样在 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 语句(应该是正确的)。当我改变方向时,两个 toasts 都会显示(显然我首先在 onSaveInstanceState 中保存了一些东西),这是不对的。为什么会这样?
在 activity 中更改此行:
loadFragment(new FragmentName());
对此:
if (savedInstanceState == null) {
loadFragment(new FragmentName());
}
FragmentManager 将自动为您保存和恢复 activity 中的片段,作为保存和恢复这些片段状态的同一过程的一部分。但是现在,每次重新创建 activity 时,您都会丢弃旧片段并用新片段替换它。