Android 单实例片段后台堆栈管理

Android 单实例片段后台堆栈管理,android,android-fragments,Android,Android Fragments,我的工作是基于单一活动的原则。但当同一个片段再次打开时,我面临一个问题,因为它再次添加了片段backstack条目。所以backstack包含同一片段的多个backstack条目。这会在后台导航上产生问题 示例:-A | B | C | D | A | C | A 所以当我按下back键时,同一个片段显示了多次。是否有任何方法可以重用backstack条目中的现有片段 我是这样管理我的后背的:- fragmentManager.beginTransaction().setCustomAnimat

我的工作是基于单一活动的原则。但当同一个片段再次打开时,我面临一个问题,因为它再次添加了片段backstack条目。所以backstack包含同一片段的多个backstack条目。这会在后台导航上产生问题

示例:-A | B | C | D | A | C | A

所以当我按下back键时,同一个片段显示了多次。是否有任何方法可以重用backstack条目中的现有片段

我是这样管理我的后背的:-

fragmentManager.beginTransaction().setCustomAnimations(R.anim.fragment_enter,
                        R.anim.fragment_exit, R.anim.pop_enter, R.anim.pop_exit).
                        add(R.id.frameLayout, fragment).addToBackStack(backStateName).commit(); 

任何帮助都将不胜感激。

在添加或替换backbackback上的片段之前,请检查片段是否已在backbackback中

boolean fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0);
if (fragmentPopped) {
   // fragment is popped from backStack
} else {
  // add or replace your fragment here      
}

使用片段列表尝试此操作

初始化片段列表

代码片段更改并收回堆栈

背压

对于后移除堆栈

调用方法在backstack中将片段替换为单个条目

changeFragment(新的YourFragmentClassName())

private void createOrResumeFragment(String fragmentTag){
  FragmentManager manager = getSupportFragmentManager();
  FragmentTransaction ft = manager.beginTransaction();
  boolean fragmentPopped = manager.popBackStackImmediate (fragmentTag, 0);
  Fragment fragment = manager.findFragmentByTag(fragmentTag);
    if(!fragmentPopped && fragment == null){   
      //Create an new instance if it is null and add it to stack 
       fragment = new MyFragment();
       ft.addToBackStack(fragmentTag);
    }
    ft.replace(R.id.framelayout, fragment); 
    ft.commit();
}
  static List<String> fragments = new ArrayList<String>();
 if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction().replace(R.id.frame, new AFragment()).commit();
        fragments.add("package.fragment.AFragment");
    }
   String backStateName = fragment.getClass().getName();
    FragmentManager manager = getSupportFragmentManager();
    //fragment not in back stack, create it.
    FragmentTransaction ft = manager.beginTransaction();
    if(!fragments.contains(backStateName)) {

       // ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        // ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out);
        ft.replace(R.id.frame, fragment);
        ft.addToBackStack(backStateName);
        ft.commit();

        fragments.add(backStateName);
        System.out.println("backStateName" + fragments);
    }
    else
    {


        ft.replace(R.id.frame, fragment);
        ft.commit();

    }
 @Override
public void onBackPressed() {
    if(fragments.size()>0)
        {
            fragments.remove(fragments.size()-1);
        }
        super.onBackPressed();
}
 final android.app.FragmentManager fm = getFragmentManager();

    fm.addOnBackStackChangedListener(new android.app.FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {

            if (getSupportFragmentManager().getBackStackEntryCount() ==0) {
               // dLayout.closeDrawers();
                finish();
            }
            else
            {
               // dLayout.closeDrawers();

            }
        }
    });
public void changeFragment(Fragment fragment) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    Fragment currentVisibleFragment = fragmentManager.findFragmentById(R.id.container);

    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.container, fragment, fragment.getClass().getSimpleName());
    if (!currentVisibleFragment.getClass().getSimpleName().trim().equalsIgnoreCase(fragment.getClass().getSimpleName().trim())) {
    for (int i = fragmentManager.getBackStackEntryCount() - 1; i > 0; i--) {
        if (fragmentManager.getBackStackEntryAt(i).getName().equalsIgnoreCase(fragment.getClass().getSimpleName())) {
            fragmentManager.popBackStack(fragmentManager.getBackStackEntryAt(i).getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
        }
    }

    fragmentTransaction.addToBackStack(fragment.getClass().getSimpleName());
    } else {
        fragmentManager.popBackStack();
        fragmentTransaction.addToBackStack(fragment.getClass().getSimpleName());
    }
    fragmentTransaction.commit();
}


boolean doubleBackToExitPressedOnce = false;

@Override
public void onBackPressed() {
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
        super.onBackPressed();
    } else {
        if (doubleBackToExitPressedOnce) {
            super.onBackPressed();
            finish();
            return;
        }

        this.doubleBackToExitPressedOnce = true;
        Toast.makeText(this, "Are you sure you want to exit?", Toast.LENGTH_SHORT).show();

        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                doubleBackToExitPressedOnce = false;
            }
        }, 2000);
    }
}