【问题标题】:Fragment not being deleted after calling .remove(fragment)调用 .remove(fragment) 后片段未被删除
【发布时间】:2018-04-14 07:57:03
【问题描述】:

我正在重写 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();
    }

}

有人可以建议我如何从事务管理器中适当地删除片段吗?

【问题讨论】:

    标签: android fragment fragmentmanager


    【解决方案1】:

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

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

    Fragment questionFrag = getSupportFragmentManager().findFragmentByTag("qFrag");
    

    仅当您调用 popBackStack() 时才返回 null。由于您没有调用它,因此即使您对其调用 remove ,该片段仍存储在后台堆栈中。

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

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

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

    【讨论】:

    • 谢谢。一直在努力解决这个话题,这肯定有帮助。
    • 这对我没有帮助。在 remove 、 commitNow 和 popBackStack() 之后它仍然存在(可以通过 Tag 找到)。
    【解决方案2】:

    试试这个,先调用 .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 代码没有正确执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      相关资源
      最近更新 更多