我正在尝试在 Android Fragments 中执行以下用例。我有 2 个 fragment 。 fragment A -> fragment B 当用户在 Fragment B 中做某事时,我希望返回堆栈如下 fragment A -> fragment C。因此,当用户按下返回键时,我希望用户返回到 fragment A。
我试过以下方法
mFragmentManager.popBackStackImmediate();
FragmentTransaction fragmentTransaction = fMgr.beginTransaction()
.replace(R.id.base, Fragment_C, "1")
.addToBackStack(null)
.commitAllowingStateLoss();
这里的问题是,在显示 fragment C 之前,我可以在短时间内看到 fragment A
如果我执行以下操作
mFragmentManager.popBackStackImmediate();
FragmentTransaction fragmentTransaction = fMgr.beginTransaction()
.replace(R.id.base, Fragment_C, "1")
.addToBackStack(null)
.commitNowAllowingStateLoss();
我得到了错误
This transaction is already being added to the back stack
如果我这样做,我可以让 fragment C 出现,但是
mFragmentManager.popBackStackImmediate();
FragmentTransaction fragmentTransaction = fMgr.beginTransaction()
.replace(R.id.base, Fragment_C, "1")
.commitNowAllowingStateLoss();
这行得通,我看不到 fragment A 和 fragment C,但后退按钮会将用户带出应用程序。那么,我们是否可以弹出 fragment 的返回堆栈,然后将另一个 fragment 添加到返回堆栈,而不显示 fragment A AND 后退按钮将用户带回到 fragment A
最佳答案
这是将 fragment 添加到 fragment 或 fragment 内的适配器的简单方法...
在您的基础 Activity 中,将您的 fragment 管理器设为静态。假设此 Activity 称为仪表板。
static FragmentManager support;
不要忘记在 onCreate 中初始化它。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_dashboard); support = getSupportFragmentManager();
在您的适配器或 fragment 中定义您的新 fragment 。
users_item_fragment dialog = new users_item_fragment(); //also, let's add some data... Bundle args = new Bundle(); args.putString("device", devicesList.get(position));
使用以下方法可以轻松地将 fragment 添加到您想要的任何地方
//pick an easily remembered tag public void replace(Fragment fragment, String tag){ FragmentManager man = dashboard.support; FragmentTransaction fragt = man.beginTransaction(); if(!fragment.isAdded()) { dashboard.lastTag = dashboard.fragtag;//not needed, but helpful w/ backpresses fragt.add(R.id.fragment_container, fragment, tag) .hide(man.findFragmentByTag(fragtag)).commit(); dashboard.fragtag = dashboard.tag;//not needed, but helpful w/ backpresses } if(fragment.isAdded() && fragment.isHidden()) { dashboard.lastTag = dashboard.fragtag;//not needed, but helpful w/ backpresses fragt.show(fragment); fragt.hide(man.findFragmentByTag(fragtag)).commit(); dashboard.fragtag = dashboard.tag;//not needed, but helpful w/ backpresses } }
要在 backpresses 正常工作的情况下实现这一点,请将其添加到您的主要 Activity 的 onBackPress 方法中:
@Override public void onBackPressed() { FragmentManager man = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = man.beginTransaction(); fragmentTransaction.hide(getSupportFragmentManager().findFragmentByTag(fragtag)) .show(getSupportFragmentManager().findFragmentByTag(lastTag)).commit(); fragtag = lastTag;// holds the last fragment } }
很容易看出这里的逻辑,也很容易使用它来操作后退事件。
关于android - fragment transaction - pop backstack 然后添加 fragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48364265/