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

时间:2016-08-23 08:52:41

标签: android android-fragments fragment android-savedstate

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

  1. 我正在使用Activity(MainActivity)并在其中调用片段,比如说ParentFragment
  2. ParentFragment在其中调用ChildFragment尽管ParentFragment有自己的视图,例如TextViews,其中包含名字,姓氏和年龄,在此部分下面我以编程方式调用ChildFragment
  3. 因此,通过这种方式,我在MainActivity中有2个片段,这些片段一次在屏幕上显示给用户

    **我想要什么**

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

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

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

      3. 请帮帮我,给我一些提示。

1 个答案:

答案 0 :(得分: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. 您将通过保留activity来接收onConfigurationChanged()回调。它与Fragment.setRetainInstance(true)无关。

  4. 为了避免再次运行asynctask,我们可以使用活动内部的以下回调来存储数据并保留它。
    @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); } }