片段交易上的片段重复

好的,每当我尝试在我的应用程序中replace一个片段时,它只会将容器中的片段添加到其他片段中,并保留当前片段。 我试过调用replace和引用视图包含片段,并通过引用片段本身。 这些都不起作用。 我可以使用片段事务pipe理器将片段添加到视图中,但是即使我尝试在添加片段后将其删除,也不起作用。 任何帮助,将不胜感激。 这是我的文件。

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //Setup the actionabar. Use setDrawableBackground to set a background image for the actionbar. final ActionBar actionbar = getActionBar(); actionbar.setDisplayShowTitleEnabled(false); actionbar.setDisplayUseLogoEnabled(true); actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); actionbar.addTab(actionbar.newTab().setText(R.string.home_tab_text).setTabListener(this),true); actionbar.addTab(actionbar.newTab().setText(R.string.insert_tab_text).setTabListener(this)); Fragment fragment = new insert_button_frag(); FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.replace(R.id.button_fragment, fragment); transaction.addToBackStack(null); transaction.commit(); } 

这是布局

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:orientation="vertical" android:id="@+id/button_fragment_container" android:layout_width="fill_parent" android:layout_height="wrap_content" > <fragment android:name="com.bv.silveredittab.home_button_frag" android:id="@+id/button_fragment" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" > <fragment android:name="com.bv.silveredittab.quick_insert_frag" android:id="@+id/quick_insert_frag" android:layout_width="350dip" android:layout_height="fill_parent" /> <fragment android:name="com.bv.silveredittab.editor_frag" android:id="@+id/editor_frag" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> </LinearLayout> 

这里是片段代码

 public class insert_button_frag extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreate(savedInstanceState); return inflater.inflate(R.layout.insert_buttons,container, false); } } 

就像我所说的 我已经尝试引用片段父视图来replace它,并且片段本身(通过id)仍然只是添加新片段,在原始片段所在的包含视图中。

我通过在我的布局中使用占位符解决了这个问题,然后在运行时将我的Fragment附加到它。

和你一样,如果我在我的xml布局中实例化了我的Fragment,那么在运行时用另一个Fragmentreplace内容后,内容将保持可见。

问题是这一行:

 transaction.replace(R.id.button_fragment, fragment); 

replace有两个重载的表单。 在他们中,第一个参数是要被replace的碎片的容器 ,而不是碎片本身。 所以,就你而言,你需要打电话

 transaction.replace(R.id.button_fragment_container, fragment); 

编辑:我看到你的问题,你已经尝试了两个。 我已经testing和validation了这个行为。 这似乎是FragmentTransaction API中的一个错误。

编辑2:毕竟不是一个错误。 您无法replace在布局文件中静态添加的片段。 您只能replace您已经编程添加( Android:不能用另一个replace一个片段 )

我遇到过同样的问题。 看看这个链接: Android的片段复制

我想知道是否将容器传递到inflater.inflate()方法的事实导致它在旧版本中创build新的碎片,而不是批量replace。 我在工作版本中向我的inflaters提供了“null”。

这是我工作的版本的要点…

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ View newFrag = new View(getActivity().getApplicationContext()); newFrag = inflater.inflate(R.id.frag, null); return newFrag; } 

谷歌开发人员指南是相当混乱,因为它显示首先在您的XML实现硬编码片段。 但是如果你真的想用新的替代现有的片段,那么你应该在运行时添加它(第一个)。

什么官方网站的状态是

FragmentTransaction replace(int containerViewId,Fragment fragment,String tag)

replace已添加到容器的现有片段。 这与为所有当前添加的片段调用remove(Fragment)相同的containerViewId,然后使用此处给定的相同参数添加(int,Fragment,String)相同。

你应该注意到,它说, replace已经添加到容器的现有片段

所以,你的XML应该看起来像someActivity.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" ... tools:context="someActivity"> <ImageView .../> <LinearLayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="bottom"/> </RelativeLayout> 

而在你的活动比在OnCreate()

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); [...] getSupportFragmentManager().beginTransaction() .add(R.id.fragment_container, new FirstFragment).commit(); } 

比你可以轻松地replace你的animation和事件片段添加到回栈,以保存其状态。

 private SecondFrag getSecondFrag(){ if(secondFrag == null) secondFrag = new SecondFrag() return secondFrag; } private void openRechargeFragment(){ FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.setCustomAnimations(R.anim.show_frag, R.anim.hide_frag, R.anim.show_frag, R.anim.hide_frag); ft.replace(R.id.fragment_container, getSecondFrag(), "myTAG"); ft.addToBackStack(null); ft.commit(); }