最近深入研究片段,据我所知,创建片段需要Java类和片段布局。这是有道理的。但是,我似乎无法绕开的是什么“容器”或用于存储/插入片段的布局?在android studio中,您可以使用this来插入片段,也可以使用任何其他布局。但是哪个是理想的选择?
我还在reddit帖子中看到,我根本不应该使用片段,而是首选使用Frame布局并随心所欲地查看所需的效果。这是真的?
答案 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();