替换ListFragment会在新列表的顶部显示上一个列表

时间:2012-11-04 02:08:09

标签: android android-fragments android-listfragment

我的一个视图中有一个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();

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

enter image description here

1 个答案:

答案 0 :(得分:0)

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

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

因此,而不是frameOne Fragment而是使用FrameLayout插入包装器布局(例如id)。在onCreate方法中,您将添加初始FragmentBowlersListFragment),然后根据Fragment中的选择,您将替换它FragmentTransaction.replace()方法包装器布局的id和新的Fragment实例。