Android:remove()Fragment – > add()new同一个类的片段再次 – > onCreateView和onActivityCreated不被调用?

我正在销毁一个程序创build的片段:

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> 

如果我再在主要活动中创build一个来自同一个类的片段:

 getSupportFragmentManager().beginTransaction() .add(R.id.result_bar, testinstance) .commit(); 

然后onCreate似乎不再调用(该片段只是空的)。 我在这里做错了什么? 谢谢。

Solutions Collecting From Web of "Android:remove()Fragment – > add()new同一个类的片段再次 – > onCreateView和onActivityCreated不被调用?"

说明:为什么FrameLayout的片段

什么是FrameLayout

根据Google文档的Commons Layouts和LinearLayout,RelativeLayout和AbsoluteLayout之间的区别是什么? , ViewGroup作为LinearLayoutRelativeLayoutAbsoluteLayout (递减)TableLayout等允许显示视图:

  1. LinearLayout:“逐个显示视图”
  2. RelativeLayout:“显示关于另一个视图的视图”
  3. TableLayout:“显示表中的视图”
    等等

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

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

来源: FrameLayout MobilTuts

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

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

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

Google的FrameLayout文档说:

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

FrameLayout将托pipe一个布局 ,它愿意。 而ViewGroup的其余部分只是显示视图。 你可以在所有ViewGroup创build一个Fragment (我testing过,这对我来说是一个惊喜),但是这不会是一个正确的方法。 FrameLayout是:

“…当你想重叠视图的正常布局select”。

如果使用<fragment .../>创build布局,那么您的片段将不会被另一个片段replace,因为它被显示,它在视图上与它的id“附加”。 要replace一个片段,你需要托pipe它: “通过封装在一个FrameLayout中的片段,你可以只取代细节” (见这个答案 )。

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

希望这会有所帮助。

注意:如果有人想编辑这个答案,因为这个答案没有解释或者说得不好,他/她可以尽情地说。