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

时间:2017-11-03 17:18:24

标签: android android-fragments

问题:

我有一个活动有2个片段: Fragment1 Fragment2

点击我的RecyclerView中的一个项目后,我使用以下行调用Fragment2:

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

当用户关闭Fragment2(BackButton或关闭按钮)时,屏幕上会再次显示Fragment1。

我需要什么:

当Fragment1的实例再次出现在屏幕上时调用的事件是什么?

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

Image

问题:

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

另一个可能性?

我还想过使用startActivityForResult& onActivityResult,但如果用以下几行调用Fragment2,我不知道如何使用它:

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

感谢。

3 个答案:

答案 0 :(得分:0)

不幸的是,片段的生命周期事件都不会被调用为posted here

在处理startActivityForResult时,

Fragment无法帮助您。

您可以做的是add a listener to the fragment backstack,并在从后台堆叠中弹出fragment 1时获得通知。 您可以在Activity中执行此操作,保留Fragment(s)的引用,然后在Fragment上调用某个方法以通知它已“重新出现”。

答案 1 :(得分:0)

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

不会从容器中删除片段。它仍然存在于容器中,这就是您没有收到回调的原因。

如果您使用,

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

上一个片段将从容器中删除,您将收到正常的回调。

答案 2 :(得分:0)

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

  

你可以做的是在片段后台堆栈中添加一个监听器,并在从backstack弹出片段1时获得通知

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

对于实施,你必须这样做:

<强> 1

包含您的片段的活动必须像下面的代码一样实施 OnBackStackChangedListener

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();

之后,您不需要做任何其他事情。

编码好!