〇、概述:
Android是在Android 3.0 (API level 11)开始引入Fragment的。
【如果兼容3.0之前的版本,需要导入v4包】
1、可以把Fragment想成Activity中的模块,这个模块有自己的布局,有自己的生命周期,单独处理自己的输入,在Activity运行的时候可以加载或者移除Fragment模块。
2、可以把Fragment设计成可以在多个Activity中复用的模块。
3、当开发的应用程序同时适用于平板电脑和手机时,可以利用Fragment实现灵活的布局,改善用户体验。
一、概念及其特点(面试常考)
1.什么是Fragment:
1)更好的利用屏幕,实现手机与PAD同时适应,
2)实现布局文件和java代码的重复使用
3)一个屏幕中放多个Fragment
多个Fragment可以放在一个Activity中,
一个Fragment也可以放在多个Activity中
2.Fragment的特点与优点:
特点: 是一个有生命周期的UI控件,(独立的生命周期)
它的生命周期由宿主Activity来决定
Fragment的创建必须依赖Activity
优点: 使用PAD屏幕,充分利用屏幕资源
实现布局文件和java代码的重用
【注!!通过在XML文件中添加<fragment>
使得调用这个XML布局的页面都显示fragment中定义的内容。一个XML文件中可以定义多个fragment】
3.静态显示Fragment:
(1)显示Fragment,在当前页面的布局文件中添加
<fragment ></fragment>
标签
<fragment
android:id="@+id/fragment"
android:name="com.niu.fragment.FragMentHello"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" />
使用fragment注意事项:必须指明一个id或者tag属性,通过id
或者tag可以找到此fragment。name属性指向我们自己的fragment类;
名称规则:fragment所在的包名+类名,通过name直接找到Fragment(必须指定)
(2)写一个类继承Fragment;(fragment不用在清单文件中注册)
(3)重写onCreateView()方法,决定Fragment的布局(需要
创建布局的XML文件),为Fragment创建UI控件并返回view(如果不
显示,返回为null)(类似Activity中的initViews())
/**
* @param inflater:布局填充器
* @param container:包含这个Fragment的父布局
* @param savedInstanceState:一个Bundle用来做现场保护
*/
public View onCreateView(LayoutInflater
inflater, ViewGroup container, Bundle savedInstanceState) {
//(4):两种方式创建UI控件
return view;//Fragment视图;
//return inflater.inflate(R.layout.product, null);
}
(4)在重写的onCreateView方法中创建UI控件并返回
创建UI控件的两种方式:
1)方式一:getActivity()返回创建此Fragment的Activity
TextView text = new TextView(getActivity);
text.setText("hello");
text.setTextSize(30);
return text;
2)方式二:通过布局填充器返回视图
步骤:
a:在layout下创建一个XML文件,写布局
b:通过布局填充器将布局添加
//第一个参数:要填充的布局;
//第二个参数:null
View view = inflater.inflate(R.layout.button, null);
//设置相应操作
return view;
(5)在宿主Activity中通过setContentView(R.layout.fragment_layout);静态加载布局此时的Activity中,可以直接通过id访问fragment的视图的控件,之后进行操作
4.动态显示:
FragmentManager碎片管理器:通过它对Fragment进行一系
列操作,比如查找,隐藏,添加FragmentManager是Google提供的碎片管理器,只有它能对Fragment进行事务操作。
创建碎片管理器:FragmentManager fm = getFragmentManager();
属性:fm.findFragmentById(Fragment的布局Id);//查找Fragment
在Activity中你可以通过getFragmentManager()来获得Fragment对象,然后通过FragmentManager对象的beginFragmentTransaction()方法来获得FragmentTransaction对象。通过它的add()方法来添加一个Fragment到当前的Activity中。
FragmentTransaction:事务
步骤:
(1)在XML文件中给Fragment创建一个占位,<FrameLayout></FrameLayout>
并指定其id/tag,高度,宽度
<FrameLayout
android:id="@+id/contentId"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
(2)在java代码中通过getFragmentManager().beginTransaction()创建一个事务;返回值类型为FragmenTransaction
FragmentTransaction ft = getFragmentManager.beginTransaction();
(3)在FragmentTransation的begin和commit之间进行一系列的操作,一个事务只能commit一次
添加:ft.add(Fragment占位的id,Fragment的实例对象new类);
替换:ft.replace();
移除:ft.remove();
显示:ft.show();
提交:ft.commit();
特别注意:①一个事务只能commit一次②每次执行一个操作都需要开启一个事务(不能设成全局变量)
将Fragment压入到回退栈,即使生命周期重新开始,回滚后也能回到以前的值ft.addToBackStack(null);//默认空栈,必须传null
5.Fragment传值:
(1)Bundle方式:
Fragment.setArguments(Bundle) 放值
Fragment.getArguments(Bundle) 取值
Activity中设置数据:
a:通过碎片管理器开启一个事务
FragmentTransaction ft = getFragmentManager().beginTransaction();
b:实例化Fragment类,创建对象;
ContentFragment cf = new ContentFragment();// 这时并没有调用生命周期方法
c:实例化Bundle,并通过put…传值
Bundle bundle = new Bundle();
bundle.putString(key,”要传的数据”+new date());
d:使用setArguments()给Fragmenu对象设置值
cf.setArgument(bundle);
e:向Frangment中添加占位与数据
ft.add(R.id.contentId,cf);
f:最后提交
ft.commit();//commit提交后Fragment类的生命周期才开始
g:Fragment类中得到数据:
获得Bundle的值,getArguments();
Bundle bundle = getArguments();
String data = bundle.getString(key);
对数据进行操作
(2)Actvity公共方法的方式:
a:在Activity中设置初始化数据,并声明一个公共的方法,设置get,返回相应数据,供外界访问
例如:getList();
b:在Fragment中通过getActivity()方法获取
创建Fragment的归属Activity对象,将这个对象进行强制类型转换。((MainActivity)getActivity).getList()—>获得数据源list进行操作
6.Fragment的生命周期:11个
因为Fragment必须嵌入在Acitivity中使用,所以Fragment的生命周期和它的寄主Activity密切相关。
如果Activity是暂停状态,其中所有的Fragment都是暂停状态;如果Activity是stopped状态,这个Activity中所有的Fragment都不能被启动;如果Activity被销毁,那么它其中的所有Fragment都会被销毁(皮之不存,毛将焉附)。
但是,当Activity在活动状态,可以独立控制Fragment的状态,比如加上或者移除Fragment。
下图是Activity、Fragment两者生命周期的比照图:
初始化阶段—->Activity onCreate
onAttach(附着) 与归属Activity建立连接
onCreate 初始化Fragment
onCreateView 创建Fragment的UI控件
onactivityCreated 归属Activity的onCreate方法执行完之后被的调用
显示/隐藏
onStart
onResume
onPause
onStop
销毁阶段—–>Activity的onDestory
onDestoryView销毁Fragment的UI控件
onDestory 销毁Fragment
onDetach从屏幕上撕下来
当这样进行fragmenttransaction(事务)的时候,可以把fragment放入Activity的back stack中,这样用户就可以进行返回操作。
Log日志:(Ctrl+Shift+c xml文件中注释的快捷键)
从MainActivity动态添加Fragment到按返回建的log日志
E/MainActivity(21160): onCreate
E/MainActivity(21160): onStart
E/MainActivity(21160): onResume
E/ContentFragment(21160): onAttach
E/ContentFragment(21160): onCreate
E/ContentFragment(21160): onCreateView
E/ContentFragment(21160): onActivityCreated
E/ContentFragment(21160): onStart
E/ContentFragment(21160): onResume
E/ContentFragment(21160): onPause
E/MainActivity(21160): onPause
E/ContentFragment(21160): onStop
E/MainActivity(21160): onStop
E/ContentFragment(21160): onDestroyView
E/ContentFragment(21160): onDestroy
E/ContentFragment(21160): onDetach
E/MainActivity(21160): onDestroy
从MainActivity静态添加Fragment的log日志
E/MainActivity(22457): onCreate
E/ContentFragment(22457): onAttach
E/ContentFragment(22457): onCreate
E/ContentFragment(22457): onCreateView
E/ContentFragment(22457): onActivityCreated
E/MainActivity(22457): onStart
E/ContentFragment(22457): onStart
E/MainActivity(22457): onResume
E/ContentFragment(22457): onResume
E/ContentFragment(22457): onPause
E/MainActivity(22457): onPause
E/ContentFragment(22457): onStop
E/MainActivity(22457): onStop
E/ContentFragment(22457): onDestroyView
E/ContentFragment(22457): onDestroy
E/ContentFragment(22457): onDetach
E/MainActivity(22457): onDestroy
按HOME键的Log日志:
E/MainActivity(22457): onCreate
E/ContentFragment(22457): onAttach
E/ContentFragment(22457): onCreate
E/ContentFragment(22457): onCreateView
E/ContentFragment(22457): onActivityCreated
E/MainActivity(22457): onStart
E/ContentFragment(22457): onStart
E/MainActivity(22457): onResume
E/ContentFragment(22457): onResume
E/ContentFragment(22457): onPause
E/MainActivity(22457): onPause
E/ContentFragment(22457): onStop
E/MainActivity(22457): onStop
E/MainActivity(22457): onStart
E/ContentFragment(22457): onStart
E/MainActivity(22457): onResume
E/ContentFragment(22457): onResume