一、简介Fragment 是一种可以嵌入在活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间。二、优点解决了手机,平板等各种设备的适配问题;解决了多个 Activity 之间切换性能问题,使用更灵活;减少 Activity 的代码量,UI 解耦;复用性好;响应速度快,占用内存低。三、生命周期Fragment必须是依存于Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。(1)onAttach(Activity):当Activity与Fragment发生关联时调用(2)onCreate:创建Fragment(3)onCreateView(LayoutInflater,ViewGroup,Bundle):创建Fragment的视图(4)onActivityCreate(bundle):当Activity的onCreate()方法返回时调用(5)onDestoryView():当Fragment被移除时调用(6)onDetach():当Fragment与Activity取消关联时调用四、使用4.1 创建 Fragment <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android" android:layout_width=“match_parent” android:layout_height=“match_parent” android:background="#ffff00” android:orientation=“vertical” > <TextView android:layout_width=“wrap_content” android:layout_height=“wrap_content” android:layout_gravity=“center_horizontal” android:textSize=“20sp” android:text=“This is another right fragment”/></LinearLayout>public class Fragment1 extends Fragment{ private static String ARG_PARAM = “param_key”; private String mParam; private Activity mActivity; public void onAttach(Context context) { mActivity = (Activity) context; mParam = getArguments().getString(ARG_PARAM); //获取参数 } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = inflater.inflate(R.layout.fragment_1, container, false); TextView view = root.findViewById(R.id.text); view.setText(mParam); return root; } public static Fragment1 newInstance(String str) { Fragment1 frag = new Fragment1(); Bundle bundle = new Bundle(); bundle.putString(ARG_PARAM, str); fragment.setArguments(bundle); //设置参数 return fragment; }}如果在创建Fragment时要传入参数,必须要通过setArguments(Bundle bundle)方式添加,而不建议通过为Fragment添加带参数的构造函数,因为通过setArguments()方式添加,在由于内存紧张导致Fragment被系统杀掉并恢复(re-instantiate)时能保留这些数据。使用newInstance(参数)的好处是,只需关注参数,不需关注key值是什么。4.2 加载Fragment静态加载,fragment 标签<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android" android:layout_width=“match_parent” android:layout_height=“match_parent”> <!– 静态加载Fragment –> <fragment android:id=”@+id/left_fragment" android:name=“com.example.fragmenttest.LeftFragment” android:layout_width=“0dp” android:layout_height=“match_parent” android:layout_weight=“1” /></LinearLayout>动态加载,FrameLayout 存放 fragment 的容器<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android" android:layout_width=“match_parent” android:layout_height=“match_parent”> <FrameLayout android:id=”@+id/right_layout" android:layout_width=“0dp” android:layout_height=“match_parent” android:layout_weight=“1” > <!– 可以在这个容器中动态加载Fragment –> <fragment android:id="@+id/right_fragment" android:name=“com.example.fragmenttest.RightFragment” android:layout_width=“match_parent” android:layout_height=“match_parent” /> </FrameLayout></LinearLayout>AnotherRightFragment fragment = new AnotherRightFragment();FragmentManager fragmentManager = getFragmentManager();FragmentTransaction transaction = fragmentManager. beginTransaction();transaction.replace(R.id.right_layout, fragment);transaction.commit();1.创建待添加的碎片实例;2.获取到FragmentManager,在活动中可以直接调用getFragmentManager()方法得到;3.开启一个事务,通过调用beginTransaction()方法开启;4.向容器内加入碎片,一般使用replace()方法实现,需要传入容器的id和待添加的碎片实例;5.提交事务,调用commit()方法来完成。4.3 transaction常用方法:(1) transaction.add(FrameLayout的id,Fragment对象,tag名) :往Activity中添加一个Fragment。transaction.add(R.id.container, Fragment1.newInstance(“hello world”), “f1”)(2) transaction.addToBackStack(String):添加一个(当前的)Fragment到回退栈。transaction.add(R.id.container, f1, “f1”) .addToBackStack("") .commit();回退栈是由FragmentManager管理的。默认情况下,Fragment事务是不会加入回退栈的,如果想将Fragment事务加入回退栈,则可以加入addToBackStack("")。如果没有加入回退栈,则用户点击返回按钮会直接将Activity出栈;如果加入了回退栈,则用户点击返回按钮会回滚Fragment事务。(3) transaction.remove(Fragment对象):从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈,这个Fragment实例将会被销毁。如果被移除的Fragment被添加到回退栈,实例不会被销毁,但视图会被销毁(即,按back键会显示,但是视图会被重新创建,不会保存视图状态)。Fragment fragment = fragmentManager.findFragmentById(R.id.details_fragment); transaction.remove(fragment); transaction.commit(); (4) transaction.replace(Fragment id,Fragment对象):使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体。(5) transaction.hide():隐藏当前的Fragment,仅仅是设为不可见,并不会销毁。(6)transaction.show():显示之前隐藏的Fragment。(7) detach():将此Fragment从Activity中分离,会销毁其布局,但不会销毁该实例。(8) attach():将从Activity中分离的Fragment,重新关联到该Activity,重新创建其视图层次。五、通讯Activity 调用 Fragment 的方法RightFragment rightFragment = (RightFragment) getFragmentManager().findFragmentById(R.id.right_fragment);Fragment 调用 Activity 的方法// 在每个碎片中都可以通过调用getActivity()方法来得到和当前碎片相关联的活动实例MainActivity activity = (MainActivity) getActivity();// 这种方式复用性差,最好使用接口的方式。