问题:
我有一个活动有2个片段: Fragment1 和 Fragment2 。
点击我的RecyclerView中的一个项目后,我使用以下行调用Fragment2:
fragmentTransaction.add(R.id.frmFragmentItem,detailsFragment);
当用户关闭Fragment2(BackButton或关闭按钮)时,屏幕上会再次显示Fragment1。
我需要什么:
当Fragment1的实例再次出现在屏幕上时调用的事件是什么?
在修改片段的以下生命周期后,我认为可能是 onCreateView()或 onResume()但是不是(因为断点没有停止)。
问题:
那么,你能告诉我当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();
感谢。
答案 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();
之后,您不需要做任何其他事情。
编码好!