安卓:移除() Fragment--> 再次添加() 相同类的新 Fragment ->onCreateView 和 onActivityCreated 没有被调用?

8

我正在使用以下代码销毁程序创建的片段:

getFragmentManager().beginTransaction().remove(getFragmentManager().findFragmentById(R.id.test)).commit();

这是在xml文件中确定的:

<LinearLayout
    android:id="@+id/test"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

</LinearLayout>

如果我在MainActivity中再次从相同的类创建一个片段:
getSupportFragmentManager().beginTransaction()
            .add(R.id.result_bar, testinstance)
            .commit();

然后onCreate似乎没有再次调用(片段只是空的)。我在这里做错了什么?谢谢。

我认为你应该尝试使用FrameLayout而不是LinearLayout。同时,移除android:visiblity="gone",因为这会导致你的布局无法显示。 - Blo
我只是在添加新的片段时,将可见性设置为可见。 - user2212461
1
你尝试过使用FrameLayout吗?另外,为什么不使用replace()而不是remove() + add()呢? - Blo
1
好的(我的错误...),LinearLayout 似乎也可以托管 Fragment。像所有的 ViewGroup 一样,我猜。 - Blo
感谢您的评论。由于某种原因,它与FrameLayout一起工作。 - user2212461
不客气。我认为FrameLayout更愿意托管Fragment而不是其他ViewGroup。如果我找到了一个好的解释,我会发布一个答案来解释这个问题。;) - Blo
1个回答

6

解释:为什么Fragment要使用FrameLayout

什么是FrameLayout

根据谷歌关于常用布局的文档这个回答,像LinearLayoutRelativeLayoutAbsoluteLayout(已过时)、TableLayout等作为ViewGroup都能够展示视图:

  1. LinearLayout:"按照顺序一个接一个地显示视图"
  2. RelativeLayout:"根据其他视图来显示视图"
  3. TableLayout:"以表格的方式来显示视图"
    等等

FrameLayout会将视图重叠在其他视图上。它通常被用于包含布局:

"Frame Layout是Android开发者用来组织视图控制器最简单和最有效的布局之一。它们不如其他布局经常使用,因为它们通常只用于显示一个视图或重叠的视图。Frame Layout通常用作容器布局,因为它通常只有一个子视图(通常是另一个布局,用于组织多个视图)。”

来源:FrameLayout MobilTuts

"Frame Layout允许开发者在Frame Layout中仅显示单个或多个UI元素,但每个元素都将基于屏幕左上角进行定位,并且重叠的元素将被显示为重叠的元素。"

来源:适用于初学者的Android Frame Layout

好的,但是,我为什么需要用FrameLayout来做Fragment?(与LinearLayout或<fragment>相比)

谷歌关于FrameLayout的文档说:

"FrameLayout旨在阻挡屏幕上的一个区域以显示单个项目。"

FrameLayout将托管一个布局并愿意为其服务。而其他的ViewGroup只是显示视图。

如果您想要重叠视图,通常会选择正常布局。如果您创建一个带有<fragment .../>的布局,则该片段不会被其他片段替换,因为它已经被"附加"到视图上并具有其id。要替换片段,您需要将其放置在容器中:"通过将Fragment封装在FrameLayout中,您可以仅替换详细信息"(请参见此答案)。
然后,请记住FrameLayout是空的,可以承载布局。声明Fragment时(从Google的片段文档),必须附加一个类(一个ID),它不能被替换。
这就是为什么我们需要一个容器来承载此片段并重叠活动的视图!
希望本文能对您有所帮助。
注:如果有人想编辑此答案,因为某些内容没有被讲清楚或讲解不够好,可以随意修改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接