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? 的答案,ViewGroup
s 为LinearLayout
、RelativeLayout
、AbsoluteLayout
(已废弃)、TableLayout
等。允许显示视图:
-
LinearLayout: "逐一显示视图"
RelativeLayout:“显示与另一个视图相关的视图”
TableLayout:“在表格中显示视图”
等
FrameLayout
显示重叠另一个视图。它通常用于包含布局:
“框架布局是 Android 开发人员用来组织视图控件的最简单和最有效的布局类型之一。与其他一些布局相比,它们的使用频率较低,仅仅是因为它们通常仅用于显示一个视图或视图重叠。框架布局通常用作容器布局,因为它通常只有一个子视图(通常是另一种布局,用于组织多个视图)。”
来源:FrameLayout MobilTuts
“框架布局允许开发人员在框架布局中仅显示单个或多个 UI 元素,但每个元素将根据屏幕左上角定位,重叠的元素将重叠显示。”
来源:Android Frame Layout For Absolute Beginner
好的,但是为什么Fragment
需要这个? (相对于 LinearLayout 或 )
Google Documentation of FrameLayout 说:
“FrameLayout 旨在在屏幕上屏蔽一个区域以显示单个项目。”
FrameLayout
将主持一个 layout 并且它愿意这样做。而ViewGroup
s 的其余部分仅显示视图。您可以在所有ViewGroup
s 中创建Fragment
(我测试过,这对我来说是一个惊喜),但这不是正确的方法。 FrameLayout
是:
“...当您想要重叠视图时选择的正常布局。”
如果您使用<fragment .../>
创建布局,您的片段将不会被另一个片段替换,因为它已显示,它与视图上的 id 一起“附加”。要替换片段,您需要托管它:“通过将片段封装在 FrameLayout 中,您可以仅替换细节”(参见this answer)。
然后,请记住,FrameLayout
s 是空的,可以承载 布局。 Fragment
s(Fragment Documentation from Google,它非常简单地解释了如何使用片段的事实),当它们在 xml 中声明时,它们必须附加一个无法替换的类(一个 id)。
这就是为什么我们需要一个容器来承载这个片段并重叠活动的视图!
希望这会有所帮助。
注意:如果有人想编辑这个答案,因为它没有解释或解释不好,她/他可以衷心地。
【讨论】:
以上是关于Android:remove() Fragment--> add() new Fragment 再次是同一类-> onCreateView 和 onActivityCreated 没有被调的主要内容,如果未能解决你的问题,请参考以下文章
android Fragment的commit与commitAllowingStateLoss