1

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

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

因此,通过这种方式,我在 MainActivity 中有 2 个片段,它们一次在屏幕上显示给用户

**我想要的是 **

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

**问题和困惑**

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

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

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

4

1 回答 1

0
  1. 如果您想在方向更改时更改布局,则不应通过保留活动(通过为清单中定义的相应活动设置 android:configChanges="orientation" 值)或在片段中使用 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() 回调。它与 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); } }

于 2016-08-23T09:47:01.143 回答