小编典典

Android:再次删除()Fragment->add()new同一类的Fragment->不调用onCreateView和onActivityCreated吗?

java

我正在用以下命令销毁以编程方式创建的片段:

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


阅读 396

收藏
2020-11-16

共1个答案

小编典典

说明:为什么将FrameLayout用于片段

什么是FrameLayout

根据有关共用布局的Google文档以及LinearLayout,RelativeLayout和AbsoluteLayout什么区别的答案中,ViewGroup为s
LinearLayoutRelativeLayoutAbsoluteLayout (decrepated)
TableLayout等被允许显示的观点:

  1. LinearLayout:“一一显示视图”
  2. RelativeLayout:“显示与另一个视图有关的视图”
  3. TableLayout:“在表中显示视图”

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

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

来源: FrameLayout
MobilTuts

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

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

好吧,为什么我需要这个Fragment呢?(与LinearLayout或相比)

FrameLayoutGoogle文档说:

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

FrameLayout将托管一个 布局
,并且愿意这样做。其余ViewGroup的仅显示视图。你可以做一个Fragment在所有ViewGroup小号
(我测试了一下,这是一个惊喜对我来说) ,但它不会以适当的方式来做到这一点。这些FrameLayout是:

“ …当您要重叠视图时,通常选择的布局。”

如果您使用创建一个布局<fragment .../>,则您的片段将不会被另一个替换,因为它会显示出来,因此它的ID将“附加”在视图上。要替换片段,您需要对其进行托管:
“通过将片段封装在FrameLayout中,您可以仅替换细节”
(请参见此答案)。

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

希望这会有所帮助。

注意:如果有人要编辑此答案,但由于无法解释或解释不正确,则可以由衷地进行。

2020-11-16