我正在转换一个应用程序使用片段使用兼容性库。
现在,目前我有许多活动(a B C D)链接到另一个,D有一个按钮“OK”,当按下调用完成,然后气泡通过onActivityResult()额外破坏C和B。
对于我的前蜂窝片段版本,每个活动都是有效的包装碎片Af Bf Cf Df。所有的活动都是通过startActivityForResult()和onActivityResult()启动的,每个片段都可以愉快地调用getActivity().finish()
我遇到的问题是,在我的蜂窝版本中,我只有一个活动,A,片段Bf, Cf, Df是使用FragmentManager加载的。
我不明白的是,在Df中,当'OK'被按下以删除Df, Cf和Bf片段时,要做什么?
我试着让片段弹出自己的堆栈,但这导致了一个异常。onActivityResult()是无用的,因为我没有加载使用startActivityForResult()的片段。
我是不是完全想错了?我是否应该实现某种侦听器,与父片段或活动通信,以便使用事务管理器进行弹出?
如果你需要从backstack历史记录中的第四个片段弹回到第一个片段,使用标签!!
当你添加第一个片段时,你应该使用这样的代码:
getFragmentManager.beginTransaction.addToBackStack("A").add(R.id.container, FragmentA).commit()
or
getFragmentManager.beginTransaction.addToBackStack("A").replace(R.id.container, FragmentA).commit()
当你想要显示片段B,C和D时,你可以使用这个:
getFragmentManager.beginTransaction.addToBackStack("B").replace(R.id.container, FragmentB, "B").commit()
和其他信件....
要返回片段A,只需调用popBackStack(0, "A"),是的,使用您在添加它时指定的标志,并注意它必须是命令addToBackStack()中相同的标志,而不是命令replace或add中使用的标志。
不客气。
在Activity/AppCompatActivity中:
@Override
public void onBackPressed() {
if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
// if you want to handle DrawerLayout
mDrawerLayout.closeDrawer(GravityCompat.START);
} else {
if (getFragmentManager().getBackStackEntryCount() == 0) {
super.onBackPressed();
} else {
getFragmentManager().popBackStack();
}
}
}
然后调用片段:
getActivity().onBackPressed();
或者像其他答案一样,在片段中调用这个:
getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();
OnCreate:
//Add comment fragment
container = FindViewById<FrameLayout>(Resource.Id.frmAttachPicture);
mPictureFragment = new fmtAttachPicture();
var trans = SupportFragmentManager.BeginTransaction();
trans.Add(container.Id, mPictureFragment, "fmtPicture");
trans.Show(mPictureFragment); trans.Commit();
这就是我在单击事件1中隐藏片段的方式
//Close fragment
var trans = SupportFragmentManager.BeginTransaction();
trans.Hide(mPictureFragment);
trans.AddToBackStack(null);
trans.Commit();
然后在事件2中显示它
var trans = SupportFragmentManager.BeginTransaction();
trans.Show(mPictureFragment); trans.Commit();