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

How to save to state of fragment on replace

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

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

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

不仅要切换FragmentA和FragmentB,还需要操作返回按钮来切换不同状态的片段。切换片段全部清除只是添加了 addToBackStack(null)。

但是片段的状态如何保存呢?

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

小例子: 我有 main activity 和 FrameLayout(main_fragment_holder)。当用户单击 NavigationView 中的部分时,我会将 NewsFragment 或 Categories 片段显示为 main_fragment_holder (fragmentTransaction.replace())。此外,当新闻片段可见时,我可以使用工具栏中的微调器 (categories_spinner) 更改新闻类别。

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

当用户点击返回时,我希望有以下内容: CategoriesFragment->NewsFragment(Cat3)->NewsFragment(Cat2)->NewsFragment(Cat1)

而且我不知道如何正确实施它。

activity_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>

activity_main_drawer.xml

<?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_bar_main.xml

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay">


        <Spinner
            android:id="@+id/categories_spinner"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

    </android.support.v7.widget.Toolbar>


</android.support.design.widget.AppBarLayout>

@roshan-shan 提供了很好的解决方案。

I read your example.When you open NewsFragment and open category 3, 2, 1 . In this NewsFragment you need to store your steps in step_variables (for manually handle back button). After that you replace NewsFragment by CategoriesFragment. Now, you press back button from CategoriesFragment, it will restore your NewsFragment and now you need to controll back button manually from step_variables you stored.