android - fragment transaction - pop backstack 然后添加 fragment

标签 android android-fragments fragmenttransaction

我正在尝试在 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 内的适配器的简单方法...

  1. 在您的基础 Activity 中,将您的 fragment 管理器设为静态。假设此 Activity 称为仪表板。

    static FragmentManager support;
    
  2. 不要忘记在 onCreate 中初始化它。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_dashboard);
    support = getSupportFragmentManager();
    
  3. 在您的适配器或 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));
    
  4. 使用以下方法可以轻松地将 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
     }
    }
    
  5. 要在 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/

相关文章:

android - AppCompat 和 Fragment 不起作用

android - 无法开始 fragment 交易

android - 如何在设置动画时在退出 fragment 上方显示进入 fragment 。

android - std::chrono with NDK r10e 无法解析

android - 如何在 android 中设置表格布局的样式

java - 我的 Activity 中的 onResume() 发生 Android 崩溃 - 为什么?

Android FragmentTransaction 提交已调用

android - React-native/AWS API Gateway 安卓问题

java - 标签栏粘在顶部而不是折叠工具栏下方

android-fragments - Android 中的 twitter api sdk 的电子邮件 ID 为空 "com.twitter.sdk.android:twitter:1.13.1@aar"