【问题标题】:How to keep state of Parent Fragment如何保持父片段的状态
【发布时间】:2015-03-05 18:05:31
【问题描述】:

我有一个片段,其中有一个嵌套片段。我附上了一张图片来说明。所以我有一个嵌套的孩子,当我点击按钮1时,我用孩子B替换孩子A,然后在按钮2上点击我用孩子C替换孩子B。现在当我点击按钮3时,我替换父母(片段1用片段2),这就是我想要做的。

当我在 Fragment 2 上点击返回按钮时,我弹出 backstack 并显示 Fragment 1,问题是显示子 A,我需要弄清楚当我从 Fragment 2 转到 Fragment 时如何显示子 c 1. 我还需要提到 child c 包含显示在网格视图中的测试结果。有人可以帮我做吗?

编辑

下面是我用于子片段交易的代码(按钮 1 和按钮 2 点击)

 protected void nextNestedFragment(Fragment nestedFragment){
        FragmentTransaction ft = getParentFragment().getChildFragmentManager().beginTransaction();
        ft.setCustomAnimations(R.animator.enter_slide_in,R.animator.enter_slide_out,R.animator.close_slide_in, R.animator.close_slide_out);
        ft.replace(R.id.nested_fragment_container, nestedFragment).addToBackStack(null).commit();    
    }

因此,对于上述内容,我传递了我希望在父片段中导航到的下一个片段。下面是我在按钮 3 上使用的代码,用于从片段 1 导航到片段 2:

  protected void nextFragment(Fragment nextFrag){
        FragmentTransaction ft = getParentFragment().getFragmentManager().beginTransaction();
        ft.setCustomAnimations(R.animator.enter_slide_in,R.animator.enter_slide_out,R.animator.close_slide_in, R.animator.close_slide_out);
        ft.replace(R.id.fragment_container, nextFrag).addToBackStack(null).commit();
    }

【问题讨论】:

  • 你有没有把另一笔交易添加到后台?
  • 我把所有的交易都加到了backstack中,所以子交易和其他分片的交易。如果这有意义吗?所以基本上所有的交易都被添加到backstack中
  • 您能否提供在按钮 1/2/3 按下时更改子片段的代码?
  • @Ayzen 我已经编辑了我的原始帖子以包含我用于子片段和父片段的代码

标签: android android-fragments nested savestate


【解决方案1】:

首先,您需要知道,这里有 2 个不同的 FragmentManager(默认一个和 ChildFragmentManager),每个都有自己的后堆栈。当您按下后退按钮时,您会弹出第一个 FragmentManager 的后退堆栈,其中显示了 Fragment 1。

其次,当 Fragment 1 从返回堆栈中弹出时,该片段的onCreateView 被调用。而且我很确定您正在那里创建一个带有子 A 的视图。

你需要做的是保存 Fragment 的状态。这里有很多关于如何正确执行此操作的问题。从here开始。

【讨论】:

  • 你是对的,在 Fragment 1 oncreate 我添加我的孩子 A 就像这样 getChildFragmentManager().beginTransaction().add(R.id.nested_fragment_container, sensorGridFragment).commit(); 所以为了让 Fragment 1 在从 Fragment 2 按下后退按钮时显示孩子 C 我需要保存碎片状态?在我将交易添加到后台堆栈之前,我是否在按下按钮 3 时执行此操作?对不起,如果这个问题听起来很傻,这是我第一次解决这个问题
  • 作为一种解决方法,您需要片段 1 中的实例变量,其中包含有关当前附加到片段的子节点的信息。在 onCreateView 你应该检查这个变量并添加相应的孩子。在这里可以使用实例变量,因为您的 Fragment 实例不会在后台堆栈中销毁。
  • 每次更改嵌套子项时都应更改此变量。
  • 问题是,我只在 Fragment 1 中添加了那个子,然后剩余的事务发生在子 Fragment 中(因此有两个不同的 FragmentManagers),你能给我举个例子吗,就像现在一样我没跟上……我已经盯着这个看了很久,所以我的大脑有点麻木!
  • 你有 getParentFragment 方法,所以你可以使用一些 set 方法从你的子片段中设置这个变量。像这样:getParentFragment().setCurrentChild(2).
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
相关资源
最近更新 更多