调用.remove(片段)后片段未被删除

时间:2017-11-01 21:58:16

标签: android fragment fragmentmanager

我正在覆盖onBackPressed函数来更改我正在处理的应用程序的后退键的行为。

如果FragmentTransaction包含具有特定标记qFrag的片段,那么我希望它从视图中为片段设置动画。

然而,在我删除片段后,它似乎仍然存在。因此,它永远不会达到我的if语句的else条件。

 @Override
public void onBackPressed() {
    // After pressing the back key a second time, questionFrag still has a value.
    Fragment questionFrag = getSupportFragmentManager().findFragmentByTag("qFrag");

    // If question fragment in the fragment manager
    if (questionFrag != null) {
        getSupportFragmentManager()
                .beginTransaction()
                .setCustomAnimations(R.anim.slide_up, R.anim.slide_down)
                .replace(R.id.main_menu_content_frame_layout, new Fragment(), "temp")
                .remove(questionFrag)
                .commit();

    } else {
        finish();
    }

}

有人可以告诉我如何从事务管理器中正确删除片段吗?

2 个答案:

答案 0 :(得分:1)

关于此主题中的片段,您需要了解两件事:

1 - 当你给一个片段添加标签并将它添加到你肯定是后面的堆栈时,这个:

Fragment questionFrag = getSupportFragmentManager().findFragmentByTag("qFrag");
如果您致电popBackStack()

仅返回null。由于您没有调用它,即使您在其上调用remove,片段仍然存储在backstack中。

2-这段代码

.replace(R.id.main_menu_content_frame_layout, new Fragment(), "temp")
.remove(questionFrag)

是冗余的,因为当你调用replace时,你在给定容器中的每个片段上调用remove,然后添加新的那个

.replace(R.id.main_menu_content_frame_layout, new Fragment(), "temp")

就够了。

现在,有两种方法可以解决您的问题:

替换后弹出后面的堆栈:

if (questionFrag != null) {
    getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.main_menu_content_frame_layout, new Fragment(), "temp")
        .setCustomAnimations(R.anim.slide_up, R.anim.slide_down)
        .commit();

     getSupportFragmentManager().popBackStack();    

     System.out.println("questionFrag removed successfully");

    finish()
} else {
    finish();
}

或者,不是弹出backstack,而是验证片段是否在容器中

Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.main_menu_content_frame_layout);

if(fragment instanceOf QuestionFragment){
     getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.main_menu_content_frame_layout, new Fragment(), "temp")
        .setCustomAnimations(R.anim.slide_up, R.anim.slide_down)
        .commit();

     getSupportFragmentManager().popBackStack();    

     System.out.println("questionFrag removed successfully");

    finish()

} else {
    finish();
}

答案 1 :(得分:0)

试试这个,首先调用.remove,然后添加新片段(不替换,因为.remove将清空容器),然后设置自定义动画:

if (questionFrag != null) {
    getSupportFragmentManager()
            .beginTransaction()
            .remove(questionFrag)
            .add(R.id.main_menu_content_frame_layout, new Fragment(), "temp")
            .setCustomAnimations(R.anim.slide_up, R.anim.slide_down)
            .commit();

            System.out.println("questionFrag removed successfully");

            finish()
} else {
    finish();
}

您可以添加system.out来检查代码到达哪个点,这是查找错误的好方法。如果在日志中没有看到打印输出,则表示FragmentManager代码未正确执行。