我的一个视图中有一个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();
就是它像这样一起显示两个列表
答案 0 :(得分:0)
您没有正确更换碎片。
首先,FragmentTransaction.replace()
方法的文档非常清楚,它声明提供给它的id
应该是容器的id
,其容器的片段是要替换,而不是像您一样要替换的id
Fragment
。
其次,您将静态片段(在xml布局中声明)与动态片段(在运行时添加)混合,您不应该这样做。如果您要替换Fragment
,则需要在代码中声明Fragment
,而不是在xml布局中声明(有关此问题,请参阅某位Android工程师的this response)
因此,而不是frameOne
Fragment
而是使用FrameLayout
插入包装器布局(例如id
)。在onCreate
方法中,您将添加初始Fragment
(BowlersListFragment
),然后根据Fragment
中的选择,您将替换它FragmentTransaction.replace()
方法包装器布局的id
和新的Fragment
实例。