【问题标题】:Android Fragments - remove fragment from back stack if already existsAndroid Fragments - 如果已经存在,则从返回堆栈中删除片段
【发布时间】:2016-04-10 20:35:19
【问题描述】:

我有一些片段将被以下方法替换。我认为我的代码有问题,因为我想防止将片段多次添加到后堆栈中。如果我在片段 B 上单击两次,所有实例都将添加到返回堆栈中,并且按下返回按钮将通过两个创建的实例。

public void replaceFragment(Fragment fragment, boolean addToBackStack, boolean customAnimation) {
    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    String tag = fragment.getClass().getSimpleName();
    if (customAnimation) {
        transaction.setCustomAnimations(R.anim.slide_in_bottom, R.anim.slide_out_bottom, R.anim.slide_in_bottom, R.anim.slide_out_bottom);
    }
    transaction.replace(R.id.fragment_container, fragment, tag);

    // remove from back stack if exists
    // always return false!
    boolean f = manager.popBackStackImmediate(tag, 0);

    if (addToBackStack) {
        transaction.addToBackStack(tag);
    }
    transaction.commit();
}

【问题讨论】:

    标签: android android-fragments fragment-backstack


    【解决方案1】:

    保持简单,如果需要,只需添加到后台堆栈。 如果被添加的 Fragment 和当前的 Fragment 是同一个类,则不要添加到后栈中:

    public void replaceFragment(Fragment frag) {
        FragmentManager manager = getSupportFragmentManager();
        if (manager != null){
            FragmentTransaction t = manager.beginTransaction();
            Fragment currentFrag = manager.findFragmentById(R.id.content_frame);
    
            //Check if the new Fragment is the same
            //If it is, don't add to the back stack
            if (currentFrag != null && currentFrag.getClass().equals(frag.getClass())) {
                t.replace(R.id.content_frame, frag).commit();
            } else {
                t.replace(R.id.content_frame, frag).addToBackStack(null).commit();
            }
        }
    }
    

    【讨论】:

    • 这是我真正需要的。谢谢丹尼尔。我有个问题。为什么你通过null 作为回栈名?如果我通过片段标签会发生什么?
    【解决方案2】:

    在你的活动 onBackPressed 方法上试试这个:

      @Override
        public void onBackPressed() {
            FragmentManager fm = getSupportFragmentManager();
    
            if (fm.getBackStackEntryCount() > 0) {
                if (fm.getBackStackEntryAt(fm.getBackStackEntryCount() - 1).getName().equals("your fragment tag")) {
                    fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                }
    

    【讨论】:

      猜你喜欢
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多