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 似乎没有再次调用(片段只是空的)。我在这里做错了什么?谢谢。

4

1 回答 1

6

解释:为什么为 Fragment 使用 FrameLayout

什么是FrameLayout

根据关于 Commons Layouts 的 Google 文档和关于LinearLayout、RelativeLayout 和 AbsoluteLayout 之间有什么区别的答案?, ViewGroups as LinearLayout, RelativeLayout, AbsoluteLayout (decrepated) ,TableLayout等允许显示视图:

  1. LinearLayout: "一一显示视图"
  2. 相对布局:“显示关于另一个视图的视图”
  3. TableLayout:“在表格中显示视图”
    等。

FrameLayout通过重叠显示视图。它通常用于包含布局:

“框架布局是 Android 开发人员用来组织视图控件的最简单和最有效的布局类型之一。与其他一些布局相比,它们的使用频率较低,仅仅是因为它们通常仅用于显示一个视图或重叠的视图。框架布局通常用作容器布局,因为它通常只有一个子视图(通常是另一种布局,用于组织多个视图)。”

来源:FrameLayout MobilTuts

“框架布局允许开发人员在框架布局中仅显示单个或多个 UI 元素,但每个元素将根据屏幕左上角定位,重叠的元素将重叠显示。”

来源:绝对初学者的Android框架布局

好的,但是,我为什么需要这个Fragment?(相对于 LinearLayout 或 <fragment>)

FrameLayout的谷歌文档说:

“FrameLayout 旨在阻止屏幕上的一个区域以显示单个项目。”

FrameLayout将主持一个布局,它愿意这样做。而其余的ViewGroups 只是显示视图。您可以Fragment在所有ViewGroups中创建一个(我对此进行了测试,这对我来说是一个惊喜),但这不是正确的方法。它们是FrameLayout

“......当您想要重叠视图时选择的正常布局。”

如果您使用 a 创建布局<fragment .../>,您的片段将不会被另一个片段替换,因为它已显示,它与视图上的 id 一起“附加”。要替换片段,您需要托管它:“通过将片段封装在 FrameLayout 中,您可以仅替换细节”(请参阅​​此答案)。

然后,请记住FrameLayouts 是空的并且可以承载布局Fragments(来自 Google 的片段文档,它非常简单地解释了如何使用片段的事实),当它们在 xml 中声明时,它们必须附加一个无法替换的类(一个 id)。
这就是为什么我们需要一个容器来承载这个片段并重叠活动的视图!

希望这会有所帮助。

注意:如果有人想编辑这个答案,因为它没有解释或解释不好,她/他可以衷心地。

于 2013-12-19T13:49:33.650 回答