如何在屏幕旋转时更改布局时保存字段数据

How to save the fields data while changing the Layout on screen rotation

我已经阅读了很多关于数据保存实例和恢复的内容,但无法在我的案例中实施。我在申请中的情况是什么。

  1. 我正在使用 Activity (MainActivity) 并调用其中的片段让我们说 ParentFragment
  2. ParentFragment 在其中调用 ChildFragment,尽管 ParentFragment 有自己的视图,例如采用名字、姓氏和年龄的 TextViews,在这部分下面我以编程方式调用 ChildFragment

所以这样我在 MainActivity 中有 2 个片段,它们在屏幕上一次显示给用户

**我想要什么**

  1. 我希望当用户更改方向时,布局也应更改,但我还希望文本字段应保留其中的数据。
  2. 我想在配置更改时保存更多片段变量及其数据,并在屏幕方向更改后设置新布局后检索它们。

**问题与困惑**

  1. 我不知道如果我设置 Fragment.setRetainInstance(true) 那么我的片段是否仍然能够接收 onConfiguration Change 回调?

  2. 当我旋转我的设备时,片段会重新初始化,而且我的 activity 有 Asynctask 并再次运行,我希望我的 activity 保持不变数据 。我怎样才能做到这一点?

请帮助我并给我一些提示。

  1. 如果您想在方向更改时更改布局,则不应通过保留 activity 来处理配置更改(通过设置 android:configChanges="orientation" 对应的值 activity 在清单中定义)或在片段中使用 setRetainInstance()。
  2. 要在配置更改时保存片段状态,请使用
    @Override protected void onSaveInstanceState(Bundle outState) { outState.putInt(FIRST_NAME_VALUE_KEY, firstNameTextView.getText()); outState.putInt(LAST_NAME_VALUE_KEY, lastNameTextView.getText()); super.onSaveInstanceState(outState); }
    并将状态写回片段中的视图
    @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.my_fragment, container, false); if (savedInstanceState != null) { String firstName = savedInstanceState.getInt(FIRST_NAME_VALUE_KEY); String lastName = savedInstanceState.getInt(LAST_NAME_VALUE_KEY); firstNameTextView.setText(firstName); lastNameTextView.setText(lastName); } return view; }

  3. 您将收到 onConfigurationChanged() 回调,方法是保留 activity.it 与 Fragment.setRetainInstance(true) 无关。

  4. 为了避免再次出现 运行 asynctask,我们可以在 activity.
    中使用以下回调来存储和保留数据 @Override protected void onSaveInstanceState(Bundle savedInstanceState) { // Save custom values into the bundle savedInstanceState.putInt(SOME_VALUE, someIntValue); savedInstanceState.putString(SOME_OTHER_VALUE, someStringValue); // Always call the superclass so it can save the view hierarchy state super.onSaveInstanceState(savedInstanceState); }

    在 onCreate(Bundle savedInstanceState) 回调中,您可以检查 savedInstanceSate ,基于此您可以调用 u asynctask 或保留值,如下所示
    @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
 if (savedInstanceState == null) { asyncTask.execute(); } else { someIntValue = savedInstanceState.getInt(SOME_VALUE); someStringValue = savedInstanceState.getString(SOME_OTHER_VALUE); } }