我想替换片段,但是在之前的片段之后添加它

时间:2015-05-21 11:08:36

标签: android android-fragments

我想替换片段但是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>

2 个答案:

答案 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 {

        }
    }