Android 如何在替换时保存到片段的状态

Android 如何在替换时保存到片段的状态,android,android-fragments,back-stack,fragment-backstack,Android,Android Fragments,Back Stack,Fragment Backstack,我希望你能帮助我理解如何执行我的任务 我在MainActivity中显示了一个或另一个片段(为了简单起见,我们称它们为FragmentA和FragmentB)。就在片段之外,我可以影响它们的内容 例如,发生以下情况:首先加载FragmentA,然后加载FragmentB(它以条件名称State1显示内容),然后从外部将FragmentB的内容更改为State2,然后我加载FragmentA 需要使用后退按钮不仅切换FragmentA和FragmentB,而且切换不同的状态片段。切换片段全部清除刚

我希望你能帮助我理解如何执行我的任务

我在MainActivity中显示了一个或另一个片段(为了简单起见,我们称它们为FragmentA和FragmentB)。就在片段之外,我可以影响它们的内容

例如,发生以下情况:首先加载FragmentA,然后加载FragmentB(它以条件名称State1显示内容),然后从外部将FragmentB的内容更改为State2,然后我加载FragmentA

需要使用后退按钮不仅切换FragmentA和FragmentB,而且切换不同的状态片段。切换片段全部清除刚刚添加的addToBackStack(null)

但如何保存片段的状态呢

现在,当我从外部更改状态时,我调用detach并立即使用addToBackStack(null)附加一个片段。但当按下后,我得到了碎片B的最后状态

小示例: 我有FrameLayout的主要活动(main_fragment_holder)。当用户单击NavigationView中的节时,我会将新闻片段或类别片段显示给主\u片段\u持有者(fragmentTransaction.replace())。此外,当新闻片段可见时,我可以使用工具栏上的微调器(categories_微调器)更改新闻类别

例如,用户打开新闻并将类别更改为Cat1、Cat2、Cat3,然后使用NavigationView打开CategoriesFragment

当用户单击“上一步”时,我希望获得以下内容: 分类片段->新闻片段(Cat3)->新闻片段(Cat2)->新闻片段(Cat1)

我不知道如何正确地实施它

活动\u main.xml

    <?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <FrameLayout
        android:id="@+id/main_fragment_holder"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />


    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

</android.support.v4.widget.DrawerLayout>
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/nav_news"
            android:title="News" />
        <item
            android:id="@+id/nav_categories"
            android:title="Categories" />

    </group>


</menu>

活动\u main\u drawer.xml

    <?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <FrameLayout
        android:id="@+id/main_fragment_holder"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />


    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

</android.support.v4.widget.DrawerLayout>
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/nav_news"
            android:title="News" />
        <item
            android:id="@+id/nav_categories"
            android:title="Categories" />

    </group>


</menu>

app\u bar\u main.xml



@罗山山提供了很好的解决方案


我读了你的例子,当你打开NewsFragment和category 3,2, 1.在此新闻片段中,您需要将步骤存储在 步骤变量(用于手动处理后退按钮)。之后你 将NewsFragment替换为CategoriesFragment。现在,你按下后退按钮 从CategoriesFragment,它将恢复您的新闻片段,现在您 需要从存储的步骤变量手动控制后退按钮


@罗山山提供了很好的解决方案


我读了你的例子,当你打开NewsFragment和category 3,2, 1.在此新闻片段中,您需要将步骤存储在 步骤变量(用于手动处理后退按钮)。之后你 将NewsFragment替换为CategoriesFragment。现在,你按下后退按钮 从CategoriesFragment,它将恢复您的新闻片段,现在您 需要从存储的步骤变量手动控制后退按钮


你用碎片B代替碎片A,对吗?当您从FragmentB返回FragmentA时,它不会再次重新创建FragmentA。它重用FragmentA实例,您可以将状态保存在变量中。[ ()与简单地将一个片段替换为另一个片段不同的是,单个片段中的内容会发生变化。例如,fragmentB本身显示搜索结果。我显示fragmentA,然后fragmentB替换它。在用户分别搜索关键字Key1、Key2和Key3后,会看到不同的结果。然后,我将fragmentB替换为FragmentA。因此,当按下back键时,我需要获得以下内容:FragmentB(结果显示在键3上)->FragmentB(结果显示在键2上)->FragmentB(结果显示在键1上)->Fragmently我不明白你的意思。你能发布你的代码来看看流程如何吗?我添加了有问题的小示例Description我阅读你的示例。当你打开
NewsFragment
并打开类别3、2、1时。在这个
NewsFragment
中,你需要将你的步骤存储在步骤变量中(用于手动处理后退按钮)。然后用
CategoriesFragment
替换
NewsFragmen
t。现在,您从
CategoriesFragment
按后退按钮,它将恢复您的新闻片段,现在您需要从存储的步骤变量手动控制后退按钮。当您从FragmentB返回fragmente时,您将FragmentA替换为FragmentB,对吗ntA,它不会再次重新创建FragmentA。它重用FragmentA的实例,您可以将状态保存在变量中。[()与简单地将一个片段替换为另一个片段不同的是,单个片段中的内容会发生变化。例如,fragmentB本身显示搜索结果。我显示fragmentA,然后fragmentB替换它。在用户分别搜索关键字Key1、Key2和Key3后,会看到不同的结果。然后,我将fragmentB替换为FragmentA。因此,当按下back键时,我需要获得以下内容:FragmentB(结果显示在键3上)->FragmentB(结果显示在键2上)->FragmentB(结果显示在键1上)->Fragmently我不明白你的意思。你能发布你的代码来看看流程如何吗?我添加了有问题的小示例Description我阅读你的示例。当你打开
NewsFragment
并打开类别3、2、1时。在这个
NewsFragment
中,你需要将你的步骤存储在步骤变量中(用于手动处理后退按钮)。然后用
CategoriesFragment
替换
NewsFragmen
t。现在,从
CategoriesFragment
按后退按钮,它将恢复您的新闻片段,现在您需要从存储的步骤变量手动控制后退按钮。