Fragment

基本概念

FragmentActivity 的模块化组成部分,它具有自己的生命周期,能接收自己的输入事件,可以在 Activity 运行时添加或移除。 它存在于 Activity 视图层次结构的某个 ViewGroup 内部,并且会定义其自己的视图布局。
一个 Fragment 可以被加入多个 Activity ;一个 Activity 可以加入多个 Fragment

0019_fragments.png

生命周期

Fragment 生命周期,如下图所示:

0019_fragment_lifecycle.png

每个 Fragment 至少需要实现这三个生命周期回调:
onCreate() --> onCreateView() --> onPause()

FragmentActivity 的生命周期对比:
0019_activity_fragment_lifecycle.png

生命周期函数中,只有 onCreateonResumeActivityFragment 先执行,其他都是后执行,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Activity启动
Activity:: onCreate
// Fragment初始化
Fragment:: onAttach
Fragment:: onCreate
Fragment:: onCreateView
Fragment:: onActivityCreated
Fragment:: onStart
Activity:: onStart
// Activity先执行resume
Activity:: onResume
Fragment:: onResume
...
Fragment:: onPause
Activity:: onPause
Fragment:: onStop
Activity:: onStop
Fragment:: onDestroyView
Fragment:: onDestroy
Fragment:: onDetach
Activity:: onDestroy

Activity添加Fragment

静态添加

Activity 的布局文件内定义 Fragment,至少需要指定如下属性:

  • android:name
  • android:id
  • tools:layout

示例如下:

1
2
3
4
5
6
7
8
9
<fragment
// 指定一个id
android:id="@+id/frag_activity_lifecycle_c"
android:layout_width="368dp"
android:layout_height="495dp"
// fragment对应的类名
android:name="com.***.fourcomponents.FragmentLifeCycleC"
// fragment对应的layout
tools:layout="@layout/fragment_life_cycle_c" />

动态添加

代码中将 Fragment 添加到某个现有 ViewGroup,都是事务性操作,必须 commit 后才能生效。

1
2
3
4
5
6
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
FragmentLifeCycleC fragmentLifeCycleC = FragmentLifeCycleC.newInstance("ActivityLifeCycleC", "code");
//fragmentTransaction.add(R.id.frag_activity_lifecycle_c_content, fragmentLifeCycleC);
fragmentTransaction.replace(R.id.frag_activity_lifecycle_c_content, fragmentLifeCycleC);
fragmentTransaction.commit();

ActivityFragment 之间的通信

  • Activity 调用 Fragment 中的方法
    通过拿到 FragmentManager 来查找对应的 Fragment, 如下:

    1
    2
    ExampleFragment fragment = (ExampleFragment) getFragmentManager()
    .findFragmentById(R.id.example_fragment);
  • Fragment 调用 Activity 中的方法
    Fragment 定义一个接口,在 Activity 中实现这个回调。

0%