单实例片段回退栈管理

3
我正在使用基于单个活动的原则进行工作。但是当同一片段再次打开时,我遇到了一个问题,因为它再次添加到片段回退堆栈条目中。因此,回退堆栈包含相同片段的多个回退堆栈条目。这会在返回导航时产生问题。
例如:A|B|C|D|A|C|A
因此,当我按下返回键时,同一片段会显示多次。有没有办法从回退堆栈条目中重用现有的片段。
我的回退堆栈管理方式如下:
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(); 

非常感谢您的帮助。

有关IT技术的任何帮助都将不胜感激。
4个回答

1
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();
}

1

尝试使用片段列表

查看答案

初始化片段列表

  static List<String> fragments = new ArrayList<String>();

在Activity的第一个片段启动时添加以下内容:

on Start of first fragment on Activity add this

 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();

    }

onBackPressed(返回键按下时触发的函数)
 @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();

            }
        }
    });

0

在添加或替换回退栈中的片段之前,请检查该片段是否已经在回退栈中。

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

0
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);
    }
}

调用该方法以将片段替换为后退栈中的单个条目

changeFragment(new YourFragmentClassName());


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接