Android Can';不能从FrameLayout中删除片段?
我有一个横向模式的布局,左侧显示ListView,右侧显示FrameLayout。从列表中选择一个项目时,会将另一个片段添加到FrameLayoutAndroid 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)
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),会发生什么情况?它会移除堆栈中最上面的片段吗?或者会发生什么?