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

use*_*461 8 java android android-fragments fragmentmanager

我正在破坏以编程方式创建的片段:

getFragmentManager().beginTransaction().remove(getFragmentManager().findFragmentById(R.id.test)).commit();
Run Code Online (Sandbox Code Playgroud)

这是在xml文件中确定的,如下所示:

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

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

如果我然后在mainactivity中再次从同一个类创建一个片段:

getSupportFragmentManager().beginTransaction()
            .add(R.id.result_bar, testinstance)
            .commit();
Run Code Online (Sandbox Code Playgroud)

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

fll*_*llo 5

说明:为什么FrameLayout为片段

什么是FrameLayout:

根据关于Commons Layouts的Google文档和这个答案,LinearLayout,RelativeLayout和AbsoluteLayout之间什么区别?中,ViewGroup为s LinearLayout,RelativeLayout,AbsoluteLayout (decrepated) ,TableLayout等被允许显示的观点:

  1. LinearLayout:"逐个显示视图"
  2. RelativeLayout:"显示有关另一个视图的视图"
  3. TableLayout:"在表格中显示视图"
    等.

FrameLayout通过重叠另一个显示视图.它通常用于包含布局:

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

来源:FrameLayout MobilTuts

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

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

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

FrameLayoutGoogle文档说:

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

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

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

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

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

希望这会有所帮助.

注意:如果有人想编辑这个答案,因为有些事情没有解释或解释不清楚,她/他可以尽心尽力.