2012-03-28 63 views
7

我有横向模式的布局,显示在左侧和右侧的FrameLayout里一个ListView。当从列表中选择一个项目的另一个片段被添加到的FrameLayout无法从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(); 

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

+3

我有完全相同的问题。有没有达成任何决议? – Jared 2013-03-07 04:44:31

回答

3

你在声明XML片段?引用来自谷歌的Dianne Hackborn:

定义XML中的片段 主要用于将要停留的事情。如果你是 要添加和删除,你应该始终做到动态。

希望它有助于

+0

我认为他指的是在XML布局中使用标签。我没有使用它,我使用FrameLayout作为占位符并动态更新放入它的片段。我可能会尝试使用在您引用的线程中提到的F​​ragmentTransaction.hide()方法。 – DaveJohnston 2012-03-28 18:45:11

+0

那么这个API是不好的。你做了一个简单的'remove()'调用,而你期望它做的最基本的事情是行不通的。 – milosmns 2016-05-23 17:18:37

+0

它可以用于编程添加显式事务的碎片。 – Blackbelt 2016-05-23 17:24:59

0

当你发现你的片段,该标识你有参考片段容器不分片本身。 使用,当你addiing片段,然后通过TAG找到一个TAG:

MyFragment myFragment = (MyFragment) fragmentManager.findFragmentByTag("yourTag"); 
11

@DaveJohnston我曾尝试你的删除片段的代码,我刚模....谢谢:)

嘿,我不知道这为解决您的问题或没有,但你尝试这种方式,将工作:

方法添加片段:

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; 
      } 
    } 
+0

如果我写transaction.remove(null)会发生什么?它会删除堆栈中最顶部的碎片吗?或会发生什么? – 2016-04-07 09:19:40

0

我有一个非常很难找到,从而可以参照时通过XML不设<fragment>,但FragmentTransaction<FrameLayout>确实设置每Fragment动态发生这个问题。

简化格吕的解决方案,解决了什么对我来说是简单地增加.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)我更换交易和它的工作!以前的片段现在实际上被隐藏起来了。

我想像其他的转换将正常工作。

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

更换您的片段用ft.addToBackStack(null)方法后,轻松地删除您的片段时。

Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT); 

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

如果您有没有在该FrameLayout更换Fragment去除Fragment?您可以删除到正规的呼叫面前犯了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(); 

但我建议,试图找出第一,为什么片段不是摆在首位更换,检查它是否在做一些繁重的工作或东西保持它从越来越更换?但如果您需要快速临时修复,请尝试上面的代码。