Android:remove()Fragment - > add()new同一类的片段 - > onCreateView和onActivityCreated没有被调用?

时间:2013-12-18 17:01:12

标签: java android android-fragments fragmentmanager

我正在使用以下命令破坏以编程方式创建的片段:

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

1 个答案:

答案 0 :(得分:5)

说明:为什么FrameLayout为片段

什么是FrameLayout

根据Google Documentation on Commons LayoutsWhat are the differences between LinearLayout, RelativeLayout, and AbsoluteLayout?的回答,ViewGroupLinearLayoutRelativeLayoutAbsoluteLayout (已删行) )TableLayout等允许显示视图:

  1. LinearLayout:“逐个显示视图”
  2. RelativeLayout:“显示有关其他视图的视图”
  3. TableLayout:“在表格中显示视图”
    等。
  4. FrameLayout重叠显示其他视图。它通常用于包含布局:

      

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

    来源:FrameLayout MobilTuts

      

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

    来源:Android Frame Layout For Absolute Beginner

    好的但是,为什么Fragment需要这个? (vs LinearLayout或&lt; fragment&gt;)

    Google Documentation of FrameLayout说:

      

    “FrameLayout旨在屏蔽屏幕上的某个区域以显示单个项目。”

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

      

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

    如果使用<fragment .../>创建布局,则您的片段不会被其他片段替换,因为它会被显示,它会在视图上“附加”其ID。要替换片段,您需要托管它:“通过将片段封装在FrameLayout中,您可以只替换细节”(请参阅this answer)。

    然后,请记住FrameLayout是空的,可以托管布局Fragment s(Fragment Documentation from Google,它非常简单地解释了如何使用片段),当它们在xml中声明时,它们必须附加一个类(一个id),这是无法替换的。
    这就是我们需要一个容器来托管这个片段并重叠活动视图的原因!

    希望这会有所帮助。

    注意:如果有人想编辑这个答案,因为某些内容无法解释或解释不清楚,她/他可以尽心尽力。