【问题标题】:Why FragmentManager doesn't remove fragment为什么 FragmentManager 不删除片段
【发布时间】:2016-01-14 20:43:33
【问题描述】:

我正在使用此代码将Fragment 添加到我的布局中:

getSupportFragmentManager().beginTransaction()
    .replace(R.id.frameLayout, newFragment, newFragment.getClass().getName())
    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
    .commit();

newFragment 是我想要显示的新 Fragment。

我用来从FragmentManager 中删除片段的下一个代码:

Fragment fragment = getSupportFragmentManager().findFragmentByTag(newFragment.getClass().getName());

if(fragment != null) {
    getSupportFragmentManager()
        .beginTransaction()
        .remove(fragment)
        .commit();
}

但是没有用!如果我想从FragmentManager 和findFragmentByTag 获取相同的片段,它会返回它。

我的问题是如何从FragmentManager 中删除我的Fragment?

【问题讨论】:

  • 您是否收到错误消息?或者你的片段只是留在你的屏幕上? remove 被执行了吗?
  • @Amy 没有任何错误。 remove 已执行,但我仍然可以使用 findFragmentByTag 获取此片段
  • Fragment 保留在FragmentManager 中,如果removed,它不会被销毁。
  • 抱歉,只是一个快速的:没关系,如果您使用替换并且您也想删除该片段?

标签: android android-fragments


【解决方案1】:
  1. 确保你使用import android.support.v4.app.Fragment; 和import android.support.v4.app.FragmentTransaction;

    • 如果导入不正确,则不会出错,但删除时返回 NULL 片段,因此不会删除。
  2. 我在 MainActivity 内的 Frame 上添加了 FirstFragment,与您的方式相同。

    getSupportFragmentManager().beginTransaction()
            .replace(R.id.myFrame, firstFrag, firstFrag.getClass().getName())
            .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
            .commit();
    
  3. 在 Backpress 上,我正在使用您的代码删除该片段,如下所示 -

    @Override
    public void onBackPressed(){
    
        Fragment fragment = getSupportFragmentManager()
                          .findFragmentByTag(firstFrag.getClass().getName());
    
        if(fragment != null) {
            getSupportFragmentManager()
                .beginTransaction()
                .remove(fragment)
                .commit();
        }
    
    }
    

【讨论】:

猜你喜欢
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
相关资源
最近更新 更多