【问题标题】:How to save the fields data while changing the Layout on screen rotation如何在更改屏幕旋转布局时保存字段数据
【发布时间】:2016-08-23 08:52:40
【问题描述】:

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

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

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

**我想要什么**

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

**问题和困惑**

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

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

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

【问题讨论】:

    标签: android android-fragments fragment android-savedstate


    【解决方案1】:
    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,我们可以在 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 ,基于此您可以调用 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); } }

    【讨论】:

    • 如何保存片段视图的数据,然后重新调用新布局?
    • 正如 2 声明中所指出的。使用 someStateValue 设置适当的视图。对于名字,将其设置为 FirstNameTextView.setText(someStateValue)
    • 你能用这个小例子编辑点 num 2 吗?如果我必须保存班级的其他成员并且我有一个模型列表视图
    • 谢谢大佬,你这话是什么意思,你会收到onConfigurationChanged()回调通过保留activity.it与Fragment.setRetainInstance(true)无关。
    • 我的意思是处理我们自己的配置更改,我们通常在清单中为该特定活动设置 android:configChanges="orientation"。如果我们这样做,我们将在该特定 Activity 以及该 Activity 中显示的 Fragment 中收到 onConfigurationChanged() 回调。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    相关资源
    最近更新 更多