1

我的一个视图中有一个 ListFragment,我在列表中进行了选择,然后用另一个列表替换了该片段。然后我再次在这个列表中进行另一个选择,用另一个列表替换这个列表,但是第三个列表总是显示在原始列表的顶部,就像它从未被替换过一样,为什么会发生这种情况,替换片段时我不能深入三层吗?

这是视图的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" 
android:orientation="horizontal">


<fragment
    android:id="@+id/frameOne"
    android:name="com.tyczj.bowling.BowlersListFragment"
    android:layout_width="300dp"
    android:layout_height="match_parent"
    android:background="@drawable/list_background_holo" />

<fragment android:name="com.tyczj.bowling.BowlerEntryFrag"
    android:id="@+id/frameTwo"
    android:layout_height="match_parent"
    android:layout_width="fill_parent"/>


</LinearLayout>

frameOne是总是被替换的片段

列表中的一个项目被选中,我打电话用一个新的替换列表

ft.replace(R.id.frameOne, infoLf).addToBackStack(null).commit();

然后在该列表中进行另一个选择,所以我再次替换它

ListFragment mBowlersBall = new BowlersBallList(bowlerID);
ft.replace(R.id.frameOne, mBowlersBall);
ft.addToBackStack(null).commit();

那就是当它像这样一起显示两个列表时

在此处输入图像描述

4

1 回答 1

0

您没有正确替换碎片。首先,该FragmentTransaction.replace()方法的文档非常清楚,它指出id提供给它的应该是要替换其片段id容器的,而不是像您一样要替换id的容器。Fragment

其次,您将静态片段(在 xml 布局中声明)与动态片段(在运行时添加)混合,这是您不应该做的。如果您要替换它,Fragment您需要Fragment在代码中而不是在 xml 布局中声明它(请参阅一位 Android 工程师关于此问题的回复)。

因此,与其frameOne Fragment插入一个FrameLayout带有id. 在该onCreate方法中,您将添加您的初始Fragment( BowlersListFragment),然后,基于在 that 中的选择,您将通过将包装布局和新实例Fragment的方法提供给FragmentTransaction.replace()方法来替换它。idFragment

于 2012-11-04T09:44:06.407 回答