当前位置: 首页 > 知识库问答 >
问题:

当片段从堆栈中再次出现时调用哪个事件

甄成弘
2023-03-14

问题是:

我有一个带有2个片段的活动:片段1和片段2。

点击一个项目后,从我的回收站视图我调用Fragment2与以下行:

fragmentTransaction.add(R.id.frmFragmentItem,detailsFragment);

当用户关闭Fragment2(BackButton或关闭按钮)时,Fragment1再次出现在屏幕上。

我需要的是:

当Fragment1实例再次出现在屏幕中时,调用的事件是哪个?

修改了片段的以下生命周期之后,我认为可能是onCreateView()或onResume(),但不是(因为断点没有停止)。

问题是:

那么,你能告诉我当Fragment1再次出现在屏幕上时调用哪个事件吗(片段的实例已经创建)

另一种可能性?

我还想用startActivityForResult

Fragment2 detailsFragment = new Fragment2 ();
        android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(R.id.frmFragmentItem,detailsFragment);
        fragmentTransaction.commit();

谢谢

共有3个答案

谢麒
2023-03-14

在@Ascorbin回答之后,我可以实现他所说的:

您可以做的是向片段backstack添加一个侦听器,并在片段1从backstack弹出时获得通知

我认为展示如何实现解决方案很重要,因为在互联网上没有关于它的信息。

对于实现,您必须做到:

1.

包含片段的活动必须实现OnBackbackChangedListener,如下面的代码所示

public class Activity extends AppCompatActivity implements FragmentManager.OnBackStackChangedListener 

2.

然后,在活动中,您必须覆盖侦听器,以便:

@Override
public void onBackStackChanged() {
    if(fragment1 != null)
        fragment1.doTheAction();
}

因此,当用户再次从Fragment2返回到Fragment1时,将调用onBackStackChanged方法,Fragment1将执行doTheAction函数。

最后,当Fragment1启动Fragment2时,我在活动中执行以下代码:

 Fragment2 secondFragment= new Fragment2();
 android.app.FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
 fragmentTransaction.add(R.id.frmFragmentItem,secondFragment);
 fragmentTransaction.addToBackStack("FRAGMENT_1");
 getFragmentManager().addOnBackStackChangedListener(this);
 fragmentTransaction.commit();

在那之后,你不需要做任何其他事情。

不错的编码!

梁丘远航
2023-03-14
fragmentTransaction.add(R.id.frmFragmentItem,detailsFragment);

不会从容器中删除片段。它仍然驻留在容器中,这就是您不接收回调的原因。

如果你使用,

fragmentTransaction.replace(R.id.frmFragmentItem,detailsFragment);

前一个片段将从容器中删除,您将收到您期望的正确回调。

艾骏喆
2023-03-14

不幸的是,这里发布的片段的生命周期事件都不会被调用。

starActivityForResult不会帮助你处理碎片时。

您可以做的是向片段后栈添加侦听器,并在从后栈弹出片段1时获得通知。你可以在你的活动中这样做,保留你的片段的引用,然后调用片段上的一些方法来通知它它已经“重新出现”。

 类似资料:
  • 我有FragmentA和FragmentB,当FragmentA变回可见时,我有一个设置活动标题的问题。 流动 null 碎片b

  • 嗨,伙计们,这是我的密码 我基本上只有2个碎片,只有家庭装饰应该添加到背面堆叠。在HomeFragment和OtherFragment之间切换了一段时间,然后在HomeFragment上单击back按钮,最后我会看到HomeFragment显示了好几次。在家庭框架内有一个回收视图。当我上下滚动时,我真的可以看到行显示了多次。我如何才能确保家庭装饰只添加到一次后堆栈。 谢谢

  • 如何从堆栈中弹出特定片段,并从片段中删除其他片段?例如,这些是我的片段,我现在在E right know。 A- 想从E回到B,清除C和D。我怎么能做到这一点?

  • 可以使用保存删除片段时的状态,然后在将片段弹出后堆栈时恢复状态吗?当我从后堆栈还原片段时,savedInstanceState包始终为空。 现在,应用程序流程是:创建的片段->删除的片段(添加到后堆栈)->从后堆栈恢复的片段(savedInstanceState包为空)。 下面是相关代码: 我认为问题是在被移除和添加到后堆栈时从未被调用。如果我不能使用onsavedInstanceState(),

  • 我想在这个导航用例中避免这种情况:A- 其中所有片段实例都保存在后栈中。原因:避免内存溢出错误。 我尝试创建一个自己的导航工作流,如下所述:https://stackoverflow.com/questions/18041583/fragments-backstack-issue?noredirect=1#comment26393904_18041583(它应该模仿活动行为,在开始一个新操作后调用

  • 我有一个包含框架布局的活动,片段A托管在这里与一起。 此片段A托管了另外两个包含回收器视图的片段——使用< code > fragmentstatepageradar 的片段A1和片段A2。此时,我能够在片段A1和A2中使用< code > getSupportFragmentManager()获得父片段。 单击A1和A2中的回收器视图项会产生另一个片段,比如片段B,它会替换片段A并将其添加到ba