android - 哪个布局与片段一起使用?
问题描述
最近深入研究片段,据我了解,创建片段需要一个 java 类和片段布局。这是有道理的。但是,我似乎无法理解的是什么“容器”或我用来存储/插入片段的布局?在 android studio 中,您可以使用它来插入片段,也可以使用任何其他布局。但是哪一个最适合使用?
此外,我在 reddit 帖子中看到我根本不应该使用片段,而是更喜欢使用框架布局并使用视图可见性来获得所需的效果。这是真的?
解决方案
您将片段的概念稍微复杂化了。
片段和活动一样,实际上并不需要专门的片段布局 xml 文件。如果您选择这样做,您可以通过 Java 代码创建整个布局,我不会理解您为什么会选择这样做。
所以对于 Fragments,您不需要 Java 类和 Fragment 的布局文件。唯一的要求是 Java 类,并且布局文件只是扩展布局的首选方法,类似于活动的方式。
至于您关于片段容器的问题,这实际上是您的应用程序设计的问题。
FragmentManager
您可以通过in 代码或<fragment>
layout.xml 文件中的标记将 Fragment 添加到您的 Activity 或其他 Fragment 。
这些都不是最好的方式或首选方式,因为它真的取决于你的应用程序需要什么。
使用<fragment>
标签将导致在布局膨胀时始终添加该片段。如果您的 Activity 由于使用 ViewPagers、Tabs、Drawer Navigation 等而需要动态切换 Fragment,这实际上是非常糟糕的。但是,如果不需要动态切换 Fragment 并且对于特定的 Activity 或父 Fragment,那就太好了,此片段是始终加载的片段。
例如,假设您设计了一个灵活的 AddNew Fragment,用于 Dialog 和 AddNewActivity。由于重复使用相同的屏幕和代码,您决定将这部分代码作为片段,以便您可以将其插入到 DialogFragment 或另一个 Activity 中。但是,对于那些 DialogFragment 和 Activity,它唯一拥有的 Fragment 是 AddNewFragment,因此通过<fragment>
标签将该片段插入到 Dialog 布局和 Activity 布局中是有意义的。
至于使用 Java 代码的选项,首选方法是使用FrameLayout
. 但是没有必要玩弄任何视图可见性!
常见的方法是只使用:
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
使用 FrameLayout 是因为它将成为 Fragment 的容器。换句话说,Fragment 将存储在此布局中。
因此,在 Java 代码中,您可以简单地使用此代码将容器内的 Fragment 替换为您的新代码:
getSupportFragmentManager().beginTransaction().replace(R.id.container, AddNewFragment.newInstance()).commit();
或者,如果您希望将片段放置在 FrameLayout 容器中的另一个片段的顶部,则可以使用add()
代替。replace()
因此,是的,要对您的问题给出决定性的答案,没有理想的方法可以将片段添加到 Activity 或另一个片段。每个选项都有其优点和缺点,有些在某些情况下效果更好,而另一些在其他情况下效果更好。
最后,这真的取决于您的应用程序需要什么。如果你需要你的 Fragment 灵活,所以你可以切换 Fragments,那么这必须通过 Java 代码来完成,因为通过<fragment>
标签添加的 Fragment 不能在运行时被删除。但是,如果您不需要替换 Fragment 并且它肯定会始终显示相同的 Fragment,那么使用该<fragment>
标签就无需编写额外的 Java 代码来加载专用的 Fragment。
我真正需要指出的一件事是……你读到的那个 reddit 页面是错误的。使用 Fragments 的“首选”方式是不使用 FrameLayouts 并使用 View 可见性。我实际上不知道为什么甚至需要更改视图可见性。
推荐阅读
- c - 如何使用 C 中的链接实现向 Dequeue 插入和显示元素
- android - 如果我为 Paymenttokenization 选项选择“DIRECT”方法,Google Pay“快速启动演示”不显示卡列表
- python - 如何为两个子图设置相等的刻度数?
- python - 如何对具有重复列名的行进行切片并按顺序堆叠该行
- mongodb - 无法在 Heroku 上运行任何 MongoDB 命令
- javascript - NodeJS 加密/解密文件
- asp.net - 如何在多对多关系中更新联结表
- python - 我们可以通过指定角点来使用 matplotlib.Patches 绘制矩形吗?
- performance - 两种语言性能之间是否有任何校准工具?
- c# - ML.net modelbuilder 哪里可以找到测试数据?