如何将这个片段放在另一个片段之上?

时间:2015-08-03 21:44:24

标签: android android-fragments

我有这个观点:

<LinearLayout 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:orientation="vertical"
    android:background="@color/DeepSkyBlue"
    tools:context=".MainPreviewActivity"
    android:weightSum="5">

    <fragment
        android:name="com.apps.foo.bar.CleanPreviewFragment"
        android:id="@+id/clean_preview_fragment"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:layout_width="match_parent"/>

    <fragment
        android:name="com.apps.foo.bar.ProcessedPreviewFragment"
        android:id="@+id/processed_preview_fragment"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:layout_width="match_parent"/>

    <View
        android:id="@+id/center_dummy_view"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:layout_width="match_parent"/>

    <ListView
        android:layout_height="0dp"
        android:layout_weight="2"
        android:layout_width="match_parent"
        android:id="@+id/lvImageProcessChoices"/>

</LinearLayout>

我希望ID为clean_preview_fragment的片段替换为ID为processed_preview_fragment的片段。

我的应用需要在后台运行相机,以便获取帧,处理它们并在processed_preview_fragment中显示它们。

这是我的代码:

processedPreviewFragment = (ProcessedPreviewFragment) fragmentManager.findFragmentById(R.id.processed_preview_fragment);

if(getResources().getConfiguration().orientation == getResources().getConfiguration().ORIENTATION_PORTRAIT){
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.clean_preview_fragment, processedPreviewFragment);
            fragmentTransaction.commit();
        }

这是我的MainActivityonCreate

我收到此错误:

java.lang.IllegalStateException: Can't change container ID of fragment ProcessedPreviewFragment{41b14770 #1 id=0x7f0e0050}: was 2131624016 now 2131624015

1 个答案:

答案 0 :(得分:5)

您无法替换通过XML声明的片段。如果要在运行时将片段添加到容器,则应使用FragmentManager添加它。在这种情况下,容器应该是一些布局,例如FrameLayout

因此,请使用<fragment>替换XML中的<FrameLayout>标记,并在运行时添加CleanPreviewFragment。然后,当您需要替换它时,请像现在一样使用FragmentTransaction。你不应该再得到那个例外了。