片段事务 - 弹出backstack然后添加片段

时间:2018-01-21 06:28:02

标签: android android-fragments fragmenttransaction

我正在尝试在Android Fragments中执行以下用例。我有2个片段。 片段A - >片段B 当用户在片段B中执行某些操作时,我希望如下所示具有后端堆栈 片段A - >片段C.因此,当用户按下时,我希望用户返回片段A。

我试过以下

mFragmentManager.popBackStackImmediate();
FragmentTransaction fragmentTransaction = fMgr.beginTransaction()
            .replace(R.id.base, Fragment_C, "1")
            .addToBackStack(null)
            .commitAllowingStateLoss();

这里的问题是我可以在显示片段C之前的短时间内看到片段A

如果我执行以下操作

mFragmentManager.popBackStackImmediate();
FragmentTransaction fragmentTransaction = fMgr.beginTransaction()
            .replace(R.id.base, Fragment_C, "1")
            .addToBackStack(null)
            .commitNowAllowingStateLoss();

我收到错误

  

此事务已添加到后台堆栈

如果我这样做,我可以让Fragment C出现但是

mFragmentManager.popBackStackImmediate();
FragmentTransaction fragmentTransaction = fMgr.beginTransaction()
            .replace(R.id.base, Fragment_C, "1")
            .commitNowAllowingStateLoss();

这很有效,我没有看到片段A并看到片段C,但是后退按钮将用户从应用程序中取出。那么,是否有可能我们可以弹出片段的后栈,然后将另一个片段添加到后栈,而不显示片段A AND 后退按钮将用户带回片段A

1 个答案:

答案 0 :(得分:0)

这是将片段添加到片段或片段中的适配器的简便方法...

    在基本活动中,
  1. 使片段管理器保持静态。假设此活动称为仪表板。

    static FragmentManager support;
    
  2. 别忘了在onCreate中初始化它。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_dashboard);
    support = getSupportFragmentManager();
    
  3. 在适配器或片段中定义新片段。

    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. 使用以下方法轻松地在任意位置添加片段

    //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. 要使backpress正常工作来实现此目的,请将其添加到您的主要活动的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
    
    }
    }
    

很容易在这里看到逻辑,并很容易使用此操作来操纵回按事件。