片段使用哪种布局?

时间:2019-02-01 23:51:06

标签: android android-fragments

最近深入研究片段,据我所知,创建片段需要Java类和片段布局。这是有道理的。但是,我似乎无法绕开的是什么“容器”或用于存储/插入片段的布局?在android studio中,您可以使用this来插入片段,也可以使用任何其他布局。但是哪个是理想的选择?

我还在reddit帖子中看到,我根本不应该使用片段,而是首选使用Frame布局并随心所欲地查看所需的效果。这是真的?

3 个答案:

答案 0 :(得分:1)

您使Fragments的概念有些复杂。

像“活动”一样,片段实际上不需要专用的片段布局xml文件。如果您选择这样做,则可以通过Java代码创建整个布局,我不明白您为什么选择这样做。

因此对于Fragments,您不需要Java类和片段的布局文件。唯一的要求是Java类,并且layouts文件只是扩大布局的首选方法,类似于Activity的方法。

关于您有关片段容器的问题,这实际上取决于您应用程序的设计。

您可以通过代码中的FragmentManager或通过layout.xml文件中的<fragment>标签将Fragment添加到Activity或其他Fragment中。

这都不是最好的方法也不是首选的方法,因为这实际上取决于您的应用程序需要什么。

使用<fragment>标记将导致在布局膨胀时始终添加该片段。如果您的活动由于使用ViewPagers,Tab,抽屉导航等功能而需要动态切换片段,这实际上是非常糟糕的。但是,如果不需要动态切换片段,并且对于该特定活动或父片段,则这是非常重要的,该片段是始终加载的片段。

例如,假设您设计了一个灵活的AddNew片段,该片段用于Dialog和AddNewActivity。由于重复使用了相同的屏幕和代码,因此您决定将代码的这一部分作为片段,以便可以将其插入DialogFragment或另一个Activity中。但是,对于那些DialogFragments和Activity,它具有的 only 片段是AddNewFragment,因此,可以通过{{1}将该片段插入Dialog布局和Activity布局中,这是有意义的} 标签。

对于带有Java代码的选项,首选方法是使用<fragment>但是没有必要尝试任何View可见性!

常见方法是只使用:

FrameLayout

使用FrameLayout是因为它将成为Fragment的容器。换句话说,片段将存储在此布局内部。

因此,在Java代码中,您可以简单地使用以下代码将容器中的Fragment替换为新的:

<FrameLayout 
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

(可选)如果要将片段放置在FrameLayout容器中另一个片段的顶部,则可以使用getSupportFragmentManager().beginTransaction().replace(R.id.container, AddNewFragment.newInstance()).commit(); 而不是add()

是的,要对您的问题给出决定性的答案,没有理想的方法将片段添加到活动或另一个片段中。每个选项都有其优点和缺点,有些选项在某些情况下效果更好,而另一些选项在某些情况下效果更好。

最后,这实际上取决于您的应用程序需要什么。如果您需要使Fragments灵活一些,以便可以切换Fragments,则必须通过Java代码完成,因为通过replace()标记添加的片段无法在运行时删除。但是,如果您不需要替换Fragment,并且肯定会始终显示相同的Fragment,那么使用<fragment>标签就无需编写额外的Java代码来加载专用的Fragment。

我确实需要指出的一件事是...您阅读的reddit页面是错误的。 使用片段的“首选”方法不是来使用FrameLayouts并使用View可见性。我实际上不知道为什么甚至需要更改View的可视性。

答案 1 :(得分:1)

您可以使用新的androidx.fragment.app.FragmentContainerView获得比FrameLayout更好的性能。

Here更多信息。

答案 2 :(得分:0)

您可以使用Fragment布局,但这不是很灵活。如果您只显示一个Fragment,它应该可以工作,但是使用FrameLayout并将Fragment插入其中会更好,因为这可以让您随时进行更改。

您可能会看到ID为FrameLayout或类似名称的R.id.container,它的用途是Transaction

例如,如果要在布局中插入FragmentOne,只需执行此操作,然后它将其放入R.id.container

Fragment fragment = new FragmentOne();
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.container, fragment);
transaction.commit();