Android: remove() Fragment--> add() new Fragment of Same class Again->onCreateView and onActiv



>我正在用以下方法销毁以编程方式创建的片段:

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作为LinearLayoutRelativeLayoutAbsoluteLayout(递减)TableLayout等允许显示视图:

  1. 线性布局:"逐个显示视图"
  2. 相对布局:"显示与另一个视图相关的视图"
  3. TableLayout:"在表格中显示视图"
    等。

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

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

来源: 框架布局 MobilTuts

"框架布局

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

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

好的,但是,为什么我需要这个Fragment?(vs 线性布局或<片段>)

FrameLayout的Google文档说:

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

FrameLayout将主持一个布局,并且愿意这样做。而其余的ViewGroup只显示视图。您可以在所有ViewGroup中制作Fragment(我测试过,这对我来说是一个惊喜),但这不是这样做的正确方法。FrameLayout是:

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

如果您创建一个带有<fragment .../>的布局,您的片段将不会被另一个片段替换,因为它是显示的,它在视图上"附加"了它的 id。要替换片段,您需要托管它:"通过将片段封装在 FrameLayout 中,您可以只替换细节"(请参阅此答案)。

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

希望这会有所帮助。

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

相关内容

最新更新