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

时间:2016-09-21 12:46:43

标签: android android-fragments back-stack fragment-backstack

我希望您能帮助我了解如何实施我的任务。

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

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

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

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

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

小例子: 我有FrameLayout(main_fragment_holder)的主要活动。当用户单击NavigationView中显示的部分或将NewsFragment或Categories片段分割到main_fragment_holder(fragmentTransaction.replace())时。此外,当News Fragment可见时,我可以使用工具栏中的spinner(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>

1 个答案:

答案 0 :(得分:0)

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

  

我读了你的例子。当你打开NewsFragment并打开类别3,2时,   1。在这个NewsFragment中,您需要存储您的步骤   step_variables(用于手动处理后退按钮)。在那之后你   通过CategoriesFragment替换NewsFragment。现在,按下后退按钮   从CategoriesFragment,它将恢复你的NewsFragment,现在你   需要从存储的step_variables手动控制后退按钮。