首页 > 解决方案 > 哪个布局与片段一起使用?

问题描述

最近深入研究片段,据我了解,创建片段需要一个 java 类和片段布局。这是有道理的。但是,我似乎无法理解的是什么“容器”或我用来存储/插入片段的布局?在 android studio 中,您可以使用来插入片段,也可以使用任何其他布局。但是哪一个最适合使用?

此外,我在 reddit 帖子中看到我根本不应该使用片段,而是更喜欢使用框架布局并使用视图可见性来获得所需的效果。这是真的?

标签: androidandroid-fragments

解决方案


您将片段的概念稍微复杂化了。

片段和活动一样,实际上并不需要专门的片段布局 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 可见性。我实际上不知道为什么甚至需要更改视图可见性。


推荐阅读