如何在屏幕旋转时更改布局时保存字段数据
How to save the fields data while changing the Layout on screen rotation
我已经阅读了很多关于数据保存实例和恢复的内容,但无法在我的案例中实施。我在申请中的情况是什么。
- 我正在使用 Activity (MainActivity) 并调用其中的片段让我们说 ParentFragment
- ParentFragment 在其中调用 ChildFragment,尽管 ParentFragment 有自己的视图,例如采用名字、姓氏和年龄的 TextViews,在这部分下面我以编程方式调用 ChildFragment
所以这样我在 MainActivity 中有 2 个片段,它们在屏幕上一次显示给用户
**我想要什么**
- 我希望当用户更改方向时,布局也应更改,但我还希望文本字段应保留其中的数据。
- 我想在配置更改时保存更多片段变量及其数据,并在屏幕方向更改后设置新布局后检索它们。
**问题与困惑**
我不知道如果我设置 Fragment.setRetainInstance(true) 那么我的片段是否仍然能够接收 onConfiguration Change 回调?
当我旋转我的设备时,片段会重新初始化,而且我的 activity 有 Asynctask 并再次运行,我希望我的 activity 保持不变数据 。我怎样才能做到这一点?
请帮助我并给我一些提示。
- 如果您想在方向更改时更改布局,则不应通过保留 activity 来处理配置更改(通过设置 android:configChanges="orientation" 对应的值 activity 在清单中定义)或在片段中使用 setRetainInstance()。
要在配置更改时保存片段状态,请使用
@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;
}
您将收到 onConfigurationChanged() 回调,方法是保留 activity.it 与 Fragment.setRetainInstance(true) 无关。
为了避免再次出现 运行 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);
}
}
我已经阅读了很多关于数据保存实例和恢复的内容,但无法在我的案例中实施。我在申请中的情况是什么。
- 我正在使用 Activity (MainActivity) 并调用其中的片段让我们说 ParentFragment
- ParentFragment 在其中调用 ChildFragment,尽管 ParentFragment 有自己的视图,例如采用名字、姓氏和年龄的 TextViews,在这部分下面我以编程方式调用 ChildFragment
所以这样我在 MainActivity 中有 2 个片段,它们在屏幕上一次显示给用户
**我想要什么**
- 我希望当用户更改方向时,布局也应更改,但我还希望文本字段应保留其中的数据。
- 我想在配置更改时保存更多片段变量及其数据,并在屏幕方向更改后设置新布局后检索它们。
**问题与困惑**
我不知道如果我设置 Fragment.setRetainInstance(true) 那么我的片段是否仍然能够接收 onConfiguration Change 回调?
当我旋转我的设备时,片段会重新初始化,而且我的 activity 有 Asynctask 并再次运行,我希望我的 activity 保持不变数据 。我怎样才能做到这一点?
请帮助我并给我一些提示。
- 如果您想在方向更改时更改布局,则不应通过保留 activity 来处理配置更改(通过设置 android:configChanges="orientation" 对应的值 activity 在清单中定义)或在片段中使用 setRetainInstance()。
要在配置更改时保存片段状态,请使用
@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; }
您将收到 onConfigurationChanged() 回调,方法是保留 activity.it 与 Fragment.setRetainInstance(true) 无关。
为了避免再次出现 运行 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); } }