单实例片段后台管理

时间:2016-10-21 04:12:59

标签: android android-fragments

我正致力于基于单一活动的原则。但是,当同一个片段再次打开时,我遇到了一个问题,因为它再次添加了片段backstack条目。因此,backstack包含相同片段的多个backstack条目。这会在后退导航时产生问题。

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

所以当我按回键时,同一片段会多次显示。有没有办法从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(); 

任何形式的帮助都将受到赞赏。

4 个答案:

答案 0 :(得分: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 :(得分:1)

使用片段列表

尝试此操作

See the Answer Here

  

初始化片段列表

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

on Activity上的第一个片段的开头添加此

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

for back remove stack

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

            }
        }
    });

答案 2 :(得分:0)

在backstack上添加或替换片段之前,请检查片段是否已经在backstack中。

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

答案 3 :(得分: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());