如何正确使用Android中的碎片

时间:2013-05-21 20:02:18

标签: java android android-fragments

我回答了一个问题:

Replacing Fragments isn't working/Am I executing this the proper way?

因为我很难将整个概念包裹起来。过去的Google I / O视频也有所帮助,但我仍然没有理由使用片段。我再次遇到了我的问题,通过更多的搜索和Google I / O 2013视频,我又遇到了另一个问题。在开始赏金以获得关于此主题的更专家意见之后,我被引导使用FrameLayouts,但是在此I / O 13视频中19:05进入video它显示<fragment>。有人可以澄清我的任何不满或误解吗?

我使用<fragment>还是<frameLayout>?如果你看看我原来的问题,知道我来自哪里,可以获得奖励。

1 个答案:

答案 0 :(得分:4)

我在这里看到两个单独的问题; (1)<fragment>元素是什么? (2)我(意思是你)使用FrameLayout以尽可能最好的方式做我在上一个问题中尝试做的事情。

我会尽力回答这两个问题。

<fragment> XML标记只是实现片段的另一种方式。作为复习,Fragment就像活动的一部分。这是一个独立的类,但是,回顾fragment documentation,因为Fragment旨在模块化,所有片段必须位于单独的FragmentActivity内。将此视为FragmentActivity作为容器。通过将Fragment加载到FragmentActivityFragmentActivity可以提供Fragment类无法自行访问的其他有价值的功能。它还为您提供动态交换片段的机会,从而提供更灵活的用户体验。

如何将Fragment加载到其包含的FragmentActivity中取决于您要尝试完成的内容。一种方法是使用<fragment>标记。使用这种方法,不是像在前面的问题中那样在活动java代码中声明Fragment然后用FragmentTransaction加载它,而是通过XML布局加载Fragment类包含FragmentActivity

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"         
    android:orientation="horizontal"     
    android:layout_width="fill_parent"     
    android:layout_height="fill_parent">    


    <fragment 
        android:name="com.example.android.fragments.HeadlinesFragment"                 
        android:id="@+id/headlines_fragment"               
        android:layout_weight="1"               
        android:layout_width="0dp"               
        android:layout_height="match_parent" />      

</LinearLayout> 

你可以在Android docs的例子中看到这里声明的片段。然后,当FragmentActivty被调用setContentView()时,onCreate加载该片段。

public class MainActivity extends FragmentActivity {     
    @Override     
    public void onCreate(Bundle savedInstanceState) {         
    super.onCreate(savedInstanceState);         
    setContentView(R.layout.news_articles);     
    } 
}

显示片段的另一种方式就像您在前面的示例中所做的那样。使用FragmentManager,您可以创建Fragment类的新实例,并在java代码中以编程方式加载它。

那么哪种技术有意义呢?作为来自android docs demonstraits的示例,当您使用静态片段时,XML片段方法是有意义的,即您不会动态地交换片段。这是因为您无法像在java代码中那样编辑动态创建的XML布局。另外,从我所知道的,使用XML方法将片段更像是用于不同控制的布局元素。在android示例中,他们使用XML方法在平板电脑上并排显示2个fragmens。通过控制片段更像布局元素,例如,能够调整layout_weight你可以为此目的取得更好的结果。

但是,如果您正在设计一个高度动态的用户体验,例如使用ViewPager或其他一些片段将定期轮换的功能,那么使用单独的Fragment类并替换那些{更有意义{1}}因为它们变得必要。

根据您之前的问题以及动态交换片段的需要,我认为您为该实施做出了正确的选择。