>我正在用以下方法销毁以编程方式创建的片段:
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>
如果我随后在主活动中再次从同一类创建一个片段:
getSupportFragmentManager().beginTransaction()
.add(R.id.result_bar, testinstance)
.commit();
然后 onCreate 似乎没有再次调用(片段只是空的)。我在这里做错了什么?谢谢。
解释:为什么 FrameLayout for Fragment
什么是FrameLayout
:
根据Google关于共享资源布局的文档和LinearLayout,RelativeLayout和AbsoluteLayout之间有什么区别的答案,ViewGroup
s作为LinearLayout
,RelativeLayout
,AbsoluteLayout
(递减),TableLayout
等允许显示视图:
- 线性布局:"逐个显示视图"
- 相对布局:"显示与另一个视图相关的视图"
- TableLayout:"在表格中显示视图"
等。
FrameLayout
通过重叠来显示视图。它通常用于包含布局:
"框架布局是 Android 开发人员用来组织视图控件的最简单、最有效的布局类型之一。与其他一些布局相比,它们的使用频率较低,这仅仅是因为它们通常用于仅显示一个视图或重叠的视图。框架布局通常用作容器布局,因为它通常只有一个子视图(通常是另一个布局,用于组织多个视图)。
来源: 框架布局 MobilTuts
"框架布局允许开发人员在框架布局中仅显示单个或多个 UI 元素,但每个元素将根据屏幕左上角进行定位,重叠的元素将重叠显示。"
来源: 绝对初学者的安卓框架布局
好的,但是,为什么我需要这个Fragment
?(vs 线性布局或<片段>)片段>
FrameLayout的Google文档说:
"FrameLayout旨在遮挡屏幕上的某个区域以显示单个项目。
FrameLayout
将主持一个布局,并且愿意这样做。而其余的ViewGroup
只显示视图。您可以在所有ViewGroup
中制作Fragment
(我测试过,这对我来说是一个惊喜),但这不是这样做的正确方法。FrameLayout
是:
"...当您想要重叠视图时选择的正常布局。
如果您创建一个带有<fragment .../>
的布局,您的片段将不会被另一个片段替换,因为它是显示的,它在视图上"附加"了它的 id。要替换片段,您需要托管它:"通过将片段封装在 FrameLayout 中,您可以只替换细节"(请参阅此答案)。
然后,请记住,FrameLayout
是空的,可以托管布局。 Fragment
s(来自 Google 的片段文档,它非常简单地解释了如何使用片段的事实),当它们在 xml 中声明时,它们必须附加一个类(一个 id),该类不能被替换.
这就是为什么我们需要一个容器来托管这个片段并重叠活动的视图!
希望这会有所帮助。
注意:如果有人想编辑这个答案,因为它没有解释或解释不好,她/他可以衷心地。