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

Android 如何在更改屏幕旋转布局时保存字段数据,android,android-fragments,fragment,android-savedstate,Android,Android Fragments,Fragment,Android Savedstate,我已经阅读了很多关于数据保存实例和恢复的内容,但无法在我的案例中实现。我的申请是什么 我正在使用活动(MainActivity)并调用其中的片段,比如ParentFragment ParentFragment在其中调用ChildFragment,尽管ParentFragment有自己的视图,如TextView,它取名字、姓氏和年龄,在这部分下面,我以编程方式调用ChildFragment 这样,我在MainActivity中有两个片段,在屏幕上一次向用户显示 **我想要什么** 我希望当用户改变

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

  • 我正在使用活动(MainActivity)并调用其中的片段,比如ParentFragment
  • ParentFragment在其中调用ChildFragment,尽管ParentFragment有自己的视图,如TextView,它取名字、姓氏和年龄,在这部分下面,我以编程方式调用ChildFragment
  • 这样,我在MainActivity中有两个片段,在屏幕上一次向用户显示

    **我想要什么**

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

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

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

  • 请帮帮我,给我一些提示

  • 如果要在方向更改时更改布局,则不应通过保留活动(通过为清单中定义的相应活动设置android:configChanges=“orientation”值)或在片段中使用setRetainInstance()来处理配置更改
  • 要在配置更改时保存片段状态,请使用
    @覆盖
    SaveInstanceState上受保护的无效(束超出状态){
    putInt(FIRST_NAME_VALUE_KEY,firstNameTextView.getText());
    putInt(LAST_NAME_VALUE_KEY,lastNameTextView.getText());
    super.onSaveInstanceState(超出状态);
    }

    用于将状态写回片段中的视图
    @覆盖
    CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
    视图=充气机。充气(R.layout.my_碎片,容器,假);
    如果(savedInstanceState!=null){
    String firstName=savedInstanceState.getInt(FIRST\u NAME\u VALUE\u KEY);
    字符串lastName=savedInstanceState.getInt(LAST\u NAME\u VALUE\u KEY);
    firstNameTextView.setText(firstName);
    lastNameTextView.setText(lastName);
    }
    返回视图;
    }

  • 您将通过保留活动接收onConfigurationChanged()回调。它与Fragment.setRetainInstance(true)无关

  • 为了避免再次运行asynctask,我们可以在活动中使用以下回调来存储数据并保留它。
    @覆盖
    SaveInstanceState上受保护的空(Bundle savedInstanceState){
    //将自定义值保存到捆绑包中
    savedInstanceState.putInt(SOME_值,someIntValue);
    savedInstanceState.putString(SOME_OTHER_值,someStringValue);
    //始终调用超类,以便它可以保存视图层次结构状态
    super.onSaveInstanceState(savedInstanceState);
    }

    在onCreate(Bundle savedInstanceState)回调中,您可以检查savedInstanceState,基于此,您可以调用u asynctask或保留如下值
    @覆盖
    创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);

    如果(savedInstanceState==null){
    asyncTask.execute();
    }否则{
    someIntValue=savedInstanceState.getInt(SOME_值);
    someStringValue=savedInstanceState.getString(其他值);
    }
    }

  • 如果要在方向更改时更改布局,则不应通过保留活动(通过为清单中定义的相应活动设置android:configChanges=“orientation”值)或在片段中使用setRetainInstance()来处理配置更改
  • 要在配置更改时保存片段状态,请使用
    @覆盖
    SaveInstanceState上受保护的无效(束超出状态){
    putInt(FIRST_NAME_VALUE_KEY,firstNameTextView.getText());
    putInt(LAST_NAME_VALUE_KEY,lastNameTextView.getText());
    super.onSaveInstanceState(超出状态);
    }

    用于将状态写回片段中的视图
    @覆盖
    CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
    视图=充气机。充气(R.layout.my_碎片,容器,假);
    如果(savedInstanceState!=null){
    String firstName=savedInstanceState.getInt(FIRST\u NAME\u VALUE\u KEY);
    字符串lastName=savedInstanceState.getInt(LAST\u NAME\u VALUE\u KEY);
    firstNameTextView.setText(firstName);
    lastNameTextView.setText(lastName);
    }
    返回视图;
    }

  • 您将通过保留活动接收onConfigurationChanged()回调。它与Fragment.setRetainInstance(true)无关

  • 为了避免再次运行asynctask,我们可以在活动中使用以下回调来存储数据并保留它。
    @覆盖
    SaveInstanceState上受保护的空(Bundle savedInstanceState){
    //将自定义值保存到捆绑包中
    savedInstanceState.putInt(SOME_值,someIntValue);
    savedInstanceState.putString(SOME_OTHER_值,someStringValue);
    //始终调用超类,以便它可以保存视图层次结构状态
    super.onSaveInstanceState(savedInstanceState);
    }

    在onCreate(Bundle savedInstanceState)回调中,您可以检查savedInstanceState,基于此,您可以调用u asynctask或保留如下值
    @覆盖
    创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);

    如果