我想替换片段但是Android应用程序在第一个片段之后添加新片段而不是替换片段。之后,当我尝试再次替换app替换为片段,在第一个片段后添加一个片段。加载到活动上的第一个片段保持静态。任何身体都能帮忙吗?我正在使用此代码替换片段。
Fragment fr = fragment;
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.frgRemote, fr);
ft.commit();
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.cerad.home.automation.RoomsActivity$PlaceholderFragment" >
<LinearLayout
android:id="@+id/lytHeader"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/lytCamcontroller"
android:orientation="vertical" >
<TextView
android:id="@+id/tvHeading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textAppearance="?android:attr/textAppearanceMedium" />
<ImageView
android:id="@+id/stream_image"
android:layout_width="640px"
android:layout_height="480px"
android:layout_gravity="center_horizontal"
android:layout_margin="5dp"
android:background="@drawable/border"
android:contentDescription="@string/image_descriptor_video_streaming" />
<ScrollView
android:id="@id/lytCommandnControl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<fragment
android:id="@+id/frgRemote"
android:name="com.cerad.automation.DefaultRemoteFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center" >
<Button
android:id="@+id/btnTVRemote"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/button_tv_remote" />
<Button
android:id="@+id/btnDefault"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:checked="true"
android:text="@string/button_default_control" />
<Button
android:id="@+id/btnACRemote"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/button_ac_remote" />
</TableRow>
</TableLayout>
</ScrollView>
</LinearLayout>
<ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
答案 0 :(得分:0)
您可能需要重新阅读FragmentTransaction.replace()
的文档:
replace(int containerViewId, Fragment fragment)
的第一个参数不是片段视图的ID,而是片段的容器ID 。因此,您的调用会在已存在的片段的片段视图包装中添加一个新的嵌套片段(相同类型)。
来自FragmentTransaction.replace(id, frag, tag)
的文档:
这与使用相同的containerViewId添加的所有当前添加的片段调用remove(Fragment),然后使用此处给出的相同参数添加(int,Fragment,String)基本相同。
要解决此问题,您必须为包含您的片段的LinearLayout
提供ID,例如
<LinearLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
并使用容器的ID调用replace()
。
ft.replace(R.id.fragment_container, fr);
始终将唯一标记分配给预定义的片段也是一种好习惯:
<fragment
android:id="@+id/frgRemote"
android:name="com.cerad.automation.DefaultRemoteFragment"
android:tag="remote_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
如果需要,您可以通过其唯一标记处理多个片段
ft.replace(R.id.fragment_container, fr, "remote_fragment");
答案 1 :(得分:0)
我有三个片段,我这样替换:
private void displayView(int position) {
Fragment fragment = null;
switch (position) {
case 0:
fragment = new HomeFragment();
break;
case 1:
fragment = new AlterFragment();
break;
case 2:
fragment = new ExtraFragment();
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.frame_container, fragment).commit();
mDrawerList.setItemChecked(position, true);
mDrawerList.setSelection(position);
setTitle(navMenuTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
}
else {
}
}