由于Activity是重量级控件,Google在Android 3.0的时候引入了Fragment,Fragment被翻译为“碎片”,相当于是被拆分了的Activity,他们作用相似,都可以用来做界面的内容显示;但是,Fragment是依托在Activity而存在的,不能独立存在。为了更好的支持低版本的Android系统,Google在后期推出了Support.V4包,它的出现将Fragment的支持版本降低到了1.6。
Fragment的生命周期
Fragment从创建到运行的过程中所经历的生命周期
- onAttach(Activity):当Fragment与Activity相关联的时候该方法被调用,且仅被调用一次;(通常在此处获取相关联的Activity)
- onCreate(Bundle) :当Fragment初始化创建时该方法会被调用;
- onCreateView(LayoutInflater, ViewGroup, Bundle):创建并返回与Fragment相关的View;
- onActivityCreated(Bundle):当与其相关联的Activity的onCreate()方法完成后,该方法将会被调用;
- onViewStateRestored(Bundle):通知Fragment所有保存的状态都已经恢复;
- onStart():此时Fragment可见,但不可交互;(和Activity的onStart()方法作用相同)
- onResume():此时Fragment可见,可交互;(和Activity的onResume()方法作用相同)
Fragment从暂停到销毁的过程中所经历的生命周期
- onPause():此时Fragment处于暂停状态,用户不能与之交互;
- onStop() :此时Fragment处于停止状态,并且不可见;
- onDestroyView():允许Fragment清除相关联的View中的资源;
- onDestroy():清除Fragment的状态;
- onDetach():当Acitivity与Fragment解除关联时,该方法立刻被调用;
- 放上一张Activity与Fragment的启动顺序测试日志图
由上图我们可以发现,Fragment的生命周期与Activity的生命周期确实是相关联的,并且还有对应关系。
- Activity的onCreate()方法执行过程中Fragment会执行以下方法
- onAttach()
- onCreate()
- onCreateView()
- onActivityCreated()
- Activity的onDestroy()方法执行过程中Fragment会执行以下方法
- onDestroyView()
- onDestroy()
- onDetach()
- Activity的onCreate()方法执行过程中Fragment会执行以下方法
创建Fragment的两种方式
静态创建
在布局xml文件中使用引入创建好的Fragment<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment class="com.example.android.apis.app.FragmentLayout$TitlesFragment" android:id="@+id/titles" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>
**注意:**Fragment的onCreateView()方法中必须创建View,否则会出现
Caused by: java.lang.IllegalStateException: Fragment xxx.xxx.xxxx did not create a view.
动态创建
静态创建Fragment未免太过受限制,毕竟一旦在xml中设置后,就不能轻易的改变。谷歌为Fragment提供了两个类用于Fragment的动态创建。- FragmentManager:主要用于在Activity中操作Fragment
- FragmentTransaction:提供了很多对Fragment的操作方法
创建Framgment
public class ContentFragment extends Fragment {
public static ContentFragment newInstance() {
return new ContentFragment();
}
@Nullable
@Override
public View onCreateView(final LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_content, container, false);
return view;
}
}
向Activity中添加Fragment的核心代码
public void addFragment(Fragment fragment) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.fl_container, fragment, TAG)
.commit();
}