一、概述
Fragment碎片,是一种可以嵌入在 Activity 中的 UI 片段。
1、和其它 view 不同,Fragment 具备生命周期
(1) 可在一个Activity中组合使用多个Fragment,从而构成多窗格的界面。
(2) 可在多个Activity中重复使用一个Fragment。
2、必须委托在 Activity 中才能运行(必须有宿主Activity)
当一个Activity暂停/销毁时,它里面的Fragment也会暂停/销毁;当一个Activity运行时,它里面的Fragment可以独立操作。
二、生命周期
22faa026d6fb105282478de26dcd167a.png- onAttach(Contextcontext):在 Fragment 和 Activity 关联上的时候调用,且仅调用一次。在该回调中我们可以将 context 转化为 Activity 保存下来,从而避免后期频繁调用getAtivity() 获取 Activity 的局面,避免了在某些情况下 getAtivity() 为空的异常(Activity和 Fragment 分离的情况下)。同时也可以在该回调中将传入的Arguments提取并解析,在这里强烈推荐通过setArguments给Fragment传参数,因为在应用被系统回收时Fragment不会保存相关属性。
- onCreate():在最初创建Fragment的时候会调用,和Activity的onCreate类似。
- onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState):在准备绘制Fragment界面时调用,返回值为Fragment要绘制布局的根视图,当然也可以返回null。注意使用inflater构建View时一定要将attachToRoot指明false,因为Fragment会自动将视图添加到container中,attachToRoot为true会重复添加报错。onCreateView并不是一定会被调用,当添加的是没有界面的Fragment就不会调用,比如调用FragmentTransaction的add(Fragment fragment, String tag)方法。
- onActivityCreated: 在 Activity 的 onCreated 执行完时会调用。
- onStart():Fragment对用户可见的时候调用,前提是 Activity 已经 started。
- onResume():Fragment和用户可交互时会调用,前提是Activity已经resumed。
- onPause():Fragment和用户不可交互时会调用。
- onStop():Fragment不可见时会调用。
- onDestroyView():销毁该Fragment所包含的View时被调用。
- onDestroy():销毁该Fragment时调用。
- onDetach():Fragment和Activity解除关联时调用。
三、使用
1、创建类继承Fragment实现onCreateView方法。
/**
* LayoutInflater 详情参考:https://blog.csdn.net/u012702547/article/details/52628453
* */
public class BlankFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
/**
* 参数:
* 1、R.layout.fragment_blank 自定义布局的资源id
*
* 2、container 将作为自定义布局的父ViewGroup。是否将自定义布局添加到 container(由第三个参数的boolean值决定)
*
* 3、boolean值
*
* */
return inflater.inflate(R.layout.fragment_blank, container, false);
}
}
2、在layout文件夹下建fragment_blank.xml布局文件,并在第一步中引入布局。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".BlankFragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello_blank_fragment" />
</FrameLayout>
方法一:静态使用:activity的xml布局中引入即可。(注意:必须要设置android:id属性,否则程序会出错)
<fragment
android:id="@+id/frag_blank"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.example.myapplication.BlankFragment"/>
方法二:动态使用:通过FragmentManager、FragmentTransaction来进行动态添加、替换、移除、fragment从相应的容器中。
(1)在Activity的XML布局文件中创建一个带id的布局管理器,用于动态创建Fragment时容纳Fragment
<FrameLayout
android:id="@+id/fl_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
(2)在Activity里动态创建Fragment
//获得FragmentManager对象
FragmentManager fragmentManager = getSupportFragmentManager();
// 通过FragmentManager对象获得FragmentTransaction对象(开启事务)
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.fl_layout, new BlankFragment());//动态添加
fragmentTransaction.commit();//提交
网友评论