片段没有被替换,而是放在前一个片段之上

Too*_*ool 97 android android-fragments

活动:

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

Fragment1 fragment = new Fragment1();
Fragment2 fragment2 = new Fragment2();

transaction.replace(R.id.Fragment1, fragment);
transaction.addToBackStack(null);
transaction.commit();

FragmentTransaction transaction2 = getSupportFragmentManager().beginTransaction();
transaction2.replace(R.id.Fragment1, fragment2);
transaction2.addToBackStack(null);
transaction2.commit();
Run Code Online (Sandbox Code Playgroud)

视图中的代码:

<fragment
    android:id="@+id/Fragment1"
    android:name="com.landa.fragment.Fragment1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/include1" /> 
Run Code Online (Sandbox Code Playgroud)

问题是,内容并没有真正被替换 - 它被置于顶部(因此它重叠).

当我单击返回时,第一个片段会正确显示(没有第二个片段),但最初两个片段都是可见的(我只希望最后一个片段可见).

我在这里错过了什么?

Sap*_*kar 135

你在这里犯了两件事:

  1. 您无法替换静态放置在xml布局文件中的片段.您应该FrameLayout在布局中创建一个容器(例如a ),然后使用编程方式添加片段FragmentTransaction.

  2. FragmentTransaction.replace期望包含片段的容器的id而不是片段的id作为第一个参数.所以你应该将第一个参数作为你添加第一个片段的容器的id传递给.

您可以参考此链接了解更多详情.

  • 使用`FrameLayout`作为容器比使用`LinearLayout`更好. (15认同)
  • 在 Activity 中使用空的 FrameLayout 也解决了我的问题 (3认同)
  • 这样做是有效的。但是当我启动我的应用程序并立即按下后退按钮时,我最终处于片段为空的状态,而不是退出应用程序? (2认同)

swb*_*dit 30

我有一个类似的问题,但我的问题是我使用了两个不同的片段管理器:一个来自getSupportFragmentManager()和一个来自getFragmentManager().如果我添加了一个片段,SupportFragmentManager然后尝试用片段替换片段FragmentManager,片段就会被添加到顶部.我需要更改代码,以便使用相同的代码FragmentManager并处理问题.


Poo*_*ony 17

android开发者网站建议使用a FrameLayout在运行时动态加载片段.您已在xml文件中对片段进行了硬编码.因此,无法在此链接中提及的运行时删除它:

http://developer.android.com/training/basics/fragments/creating.html

此链接显示如何通过您的程序添加片段:

http://developer.android.com/training/basics/fragments/fragment-ui.html


Ema*_*mad 7

我有同样的问题,看到了所有的答案,但没有一个包含我的错误!在尝试替换当前片段之前,我在容器活动的xml中显示默认片段,如下所示:

<FrameLayout
    android:id="@+id/fragment_frame_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="....ShopFragment"
        android:id="@+id/fragment"
        tools:layout="@layout/fragment_shop" />
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

在那之后,虽然我传递FrameLayout给了fragmentTransaction.replace()但是我有确切的问题.它显示了前一个片段之上的第二个片段.

通过从xml中删除片段并以编程方式在onCreate()程序开头的默认预览的容器活动方法中显示它来解决此问题,如下所示:

    fragmentTransaction = getFragmentManager().beginTransaction();
    fragmentTransaction.replace(R.id.fragment_frame_layout,new ShopFragment());
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

和容器活动xml:

<FrameLayout
    android:id="@+id/fragment_frame_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
Run Code Online (Sandbox Code Playgroud)


Mic*_* Z. 5

您可以在替换片段之前清除 backStack:

    FragmentManager fm = getActivity().getSupportFragmentManager();

    for (int i = 0; i < fm.getBackStackEntryCount(); i++) {
        fm.popBackStack();
    }

    // replace your fragments
Run Code Online (Sandbox Code Playgroud)