Android:remove() Fragment--> add() new Fragment 再次是同一类-> onCreateView 和 onActivityCreated 没有被调

Posted

技术标签:

【中文标题】Android:remove() Fragment--> add() new Fragment 再次是同一类-> onCreateView 和 onActivityCreated 没有被调用?【英文标题】:Android: remove() Fragment--> add() new Fragment of same class again ->onCreateView and onActivityCreated not called? 【发布时间】:2014-01-06 23:34:27 【问题描述】:

我正在销毁一个以编程方式创建的片段:

getFragmentManager().beginTransaction().remove(getFragmentManager().findFragmentById(R.id.test)).commit();

在xml文件中是这样确定的:

<LinearLayout
    android:id="@+id/test"
    android:orientation="horizontal"
    android:layout_
    android:layout_>

</LinearLayout>

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

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

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

【问题讨论】:

我认为您应该尝试使用FrameLayout 而不是 LinearLayout。并因此删除android:visiblity="gone",您的布局将不会显示。 不,我在添加新片段时再次将可见性设置为可见 您尝试过 FrameLayout 吗?顺便说一句,你为什么不使用replace() 而不是remove() + add() 好吧(我的错...),LinearLayout 似乎也托管了一个片段。和所有 ViewGroup 一样,我猜。 感谢 cmets。出于某种原因,它适用于框架布局 【参考方案1】:

说明:为什么为 Fragment 使用 FrameLayout

什么是FrameLayout

根据Google Documentation on Commons Layouts 和What are the differences between LinearLayout, RelativeLayout, and AbsoluteLayout? 的答案,ViewGroups 为LinearLayoutRelativeLayoutAbsoluteLayout(已废弃)TableLayout 等。允许显示视图:

    LinearLayout: "逐一显示视图" RelativeLayout:“显示与另一个视图相关的视图” TableLayout:“在表格中显示视图” 等

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

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

来源:FrameLayout MobilTuts

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

来源:Android Frame Layout For Absolute Beginner

好的,但是为什么Fragment 需要这个? (相对于 LinearLayout 或

Google Documentation of FrameLayout 说:

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

FrameLayout 将主持一个 layout 并且它愿意这样做。而ViewGroups 的其余部分仅显示视图。您可以在所有ViewGroups 中创建Fragment (我测试过,这对我来说是一个惊喜),但这不是正确的方法。 FrameLayout 是:

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

如果您使用&lt;fragment .../&gt; 创建布局,您的片段将不会被另一个片段替换,因为它已显示,它与视图上的 id 一起“附加”。要替换片段,您需要托管它:“通过将片段封装在 FrameLayout 中,您可以仅替换细节”(参见this answer)。

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

希望这会有所帮助。

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

【讨论】:

以上是关于Android:remove() Fragment--> add() new Fragment 再次是同一类-> onCreateView 和 onActivityCreated 没有被调的主要内容,如果未能解决你的问题,请参考以下文章

android之Fragment(官网资料翻译)

Android Fragment使用问题集结

android Fragment的commit与commitAllowingStateLoss

Android中Fragment的Hide和Show

Android 保存 Fragment 引用及 getActivity() 为空问题

Android 保存 Fragment 引用及 getActivity() 为空问题