Android Can';不能从FrameLayout中删除片段?

Android Can';不能从FrameLayout中删除片段?,android,android-layout,android-fragments,Android,Android Layout,Android Fragments,我有一个横向模式的布局,左侧显示ListView,右侧显示FrameLayout。从列表中选择一个项目时,会将另一个片段添加到FrameLayout MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.myFrameLayout); FragmentTransaction ft = fragmentManager.beginTransaction(); if (myFragment == null)

我有一个横向模式的布局,左侧显示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();
}
稍后,我在列表视图中按delete键并删除列表中的最后一项,然后我尝试删除片段,以便不显示任何内容,但它不起作用,我的片段仍保留在屏幕上。删除的代码为:

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

你知道为什么不从视图中删除它吗?

你是用xml声明片段的吗?引用来自谷歌的Dianne Hackborn:

用XML定义片段 主要用于将要保留的东西。如果你是 要添加和删除,您可能应该始终动态地进行


希望它能帮助你

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

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

@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;
            }
    }
删除片段的方法:

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设置
时,我很难找到对这个问题的如此引用,但实际上是使用
片段事务
动态设置每个
片段

简化Gru的解决方案,对我来说解决它的方法就是简单地将
.setTransition(FragmentTransaction.transition\u FRAGMENT\u FADE)
添加到我的replace事务中,它成功了!以前的片段现在实际上从视图中隐藏

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

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

如果在更换
框架布局中的
片段时未删除
片段
?您可以通过使用
FragmentTransaction.TRANSIT\u FRAGMENT\u CLOSE在调用常规replace commit之前提交一个单独的删除转换来删除它

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

但是我建议首先试着弄清楚为什么这个片段没有被替换,检查它是否做了一些繁重的工作,或者有什么东西阻止它被替换??但是,如果您需要快速的临时修复,请尝试上面的代码。

我认为他指的是在XML布局中使用标记。我没有使用它,我使用一个框架布局作为占位符,并动态更新放入其中的片段。我可能会尝试使用您引用的线程中提到的FragmentTransaction.hide()方法。这个API很糟糕。您执行了一个简单的
remove()
调用,但您期望它执行的最基本的操作不起作用。它确实适用于以编程方式添加显式事务的片段。我遇到了完全相同的问题。是否已达成任何解决方案?如果我写入transaction.remove(null),会发生什么情况?它会移除堆栈中最上面的片段吗?或者会发生什么?