无法从FrameLayout中删除片段?

我有一个横向模式的布局,左侧显示一个ListView,右侧显示一个FrameLayout。 当从列表中select一个项目时,另一个片段被添加到FrameLayout

MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.myFrameLayout); FragmentTransaction ft = fragmentManager.beginTransaction(); if (myFragment == null) { myFragment = new MyFragment(uri); ft.replace(R.id.myFrameLayout, playerFragment); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); ft.commitAllowingStateLoss(); } 

后来我按列表视图中的删除,并删除列表中的最后一项,我试图删除片段,以便什么都没有显示,但它不起作用,我的片段仍然在屏幕上。 删除的代码是:

 MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.myFrameLayout); FragmentTransaction ft = fragmentManager.beginTransaction(); ft.remove(myFragment); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); ft.commitAllowingStateLoss(); 

任何想法,为什么它不被从视图中删除?

Solutions Collecting From Web of "无法从FrameLayout中删除片段?"

@DaveJohnston我已经试过你的代码删除我刚刚成型的片段….谢谢:)

嘿,我不知道这是你的问题的解决scheme,但你尝试这种方式将工作:

添加片段的方法:

 YourFragment yourFrament; //Add your Fragment public void addYourFragment(){ yourFragment = new YourFragment(); FragmentTransaction transation = getSupportFragmentManager().beginTransaction(); transation.replace(R.id.yourFlowLayout, yourFragment); transation.commit(); } 

删除碎片的方法:

  //Remove Fragment public void removeYourFragment(){ FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); if (yourFragment != null) { transaction.remove(yourFragment); transaction.commit(); transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); yourFragment = null; } } 

你是在XML中声明的片段? 从谷歌引用Dianne Hackborn:

在XML中定义片段主要用于将要停留的事物。 如果你要添加和删除,你应该一直dynamic地做。

希望能帮助到你

当你通过IDfind你的片段时,你得到了对片段容器的引用,而不是片段本身。 当你添加碎片,然后通过标签查找时使用标签:

 MyFragment myFragment = (MyFragment) fragmentManager.findFragmentByTag("yourTag"); 
 private static String TAG_FRAGMENT="MyFragment"; MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.myFrameLayout); FragmentTransaction ft = fragmentManager.beginTransaction(); if (myFragment == null) { myFragment = new MyFragment(uri); ft.replace(R.id.myFrameLayout, playerFragment,TAG_FRAGMENT); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); ft.addToBackStack(TAG_FRAGMENT); ft.commit(); } 

当replace你的片段使用ft.addToBackStack(null)方法后,轻松地删除你的片段。

 Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT); if(fragment != null) getSupportFragmentManager().beginTransaction().remove(fragment).commit(); 

我很难find一个SO引用来解决这个问题,当不是通过XML设置<fragment> ,而是通过FragmentTransaction<FrameLayout>dynamic地设置每个Fragment

简化Gru的解决scheme,为我解决它只是简单地添加.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)到我的replace交易,它的工作! 以前的片段现在实际上是隐藏的。

我想其他的转换也会起作用。

如果你有一个Fragment不能在FrameLayoutreplaceFragment ? 您可以在调用常规replace提交之前,通过在FragmentTransaction.TRANSIT_FRAGMENT_CLOSE上提交单独的删除转换来删除它。

 Fragment removeThisFragment;//Keep a reference to the fragment you want to remove ... FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); // This fragment "sometimes" do not get replaced so we remove it here if it's added. if(removeThisFragment!=null&&removeThisFragment.isAdded()) { transaction = fragmentManager.beginTransaction(); transaction.remove(removeThisFragment); transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); transaction.commitAllowingStateLoss(); } // update the main content by replacing fragments transaction = fragmentManager.beginTransaction(); transaction.replace(R.id.content_frame, fragment, TAG_MAIN_FRAGMENT).commit(); 

但是我build议先试着弄清楚为什么碎片不是首先被replace的,检查它是否做了一些繁重的工作或者是让它不被replace? 但如果您需要快速临时修复,请尝试上面的代码。