Fragment详解(一)
一,Fragment基本概念
1.Fragment,简称碎片,是Android 3.0(API 11)提出的,为了兼容低版本,support-v4库中也开发了一套Fragment API,最低兼容Android 1.6。Fragment是依赖于Activity的,不能独立存在的。建议使用V4包的Fragment.
2,优点:
2.1,模块化(Modularity):我们不必把所有代码全部写在Activity中,而是把代码写在各自的Fragment中。
2.2,可重用(Reusability):多个Activity可以重用一个Fragment。
2.3,可适配(Adaptability):根据硬件的屏幕尺寸、屏幕方向,能够方便地实现不同的布局,这样用户体验更好。
二,Fragment生命周期
1,onAttach():
Fragment和Activity相关联时调用。可以通过该方法获取 Activity引用,还可以通过getArguments()获取参数。
如果要获取Activity对象,不建议调用getActivity(),而是在onAttach()中将Context对象强转为Activity对象。
2,onCreate():Fragment被创建时调用。
3,onCreateView():
最常用,用来创建Fragment的布局。
需要注意的是inflate()的第三个参数是false,因为在Fragment内部实现中,会把该布局添加到container中,如果设为true,那么就会重复做两次添加.
4,onActivityCreated():当Activity完成onCreate()时调用。
5,onStart():当Fragment可见时调用。
6,onResume():当Fragment可见且可交互时调用。
7,onPause():当Fragment不可交互但可见时调用。
8,onStop():当Fragment不可见时调用。
9,onDestroyView():当Fragment的UI从视图结构中移除时调用。
10,onDestroy():销毁Fragment时调用。
11,onDetach():当Fragment和Activity解除关联时调用。
上面的方法中,只有onCreateView()在重写时不用写super方法,其他都需要。
三,Fragment核心的类有:
3.1,Fragment:Fragment的基类,任何创建的Fragment都需要继承该类。
3.2,FragmentManager:管理和维护Fragment。他是抽象类,具体的实现类是- FragmentManagerImpl。
3.3, FragmentTransaction:对Fragment的添加、删除等操作都需要通过事务方式进行。他是抽象类,具体的实现类是BackStackRecord。
Nested Fragment(Fragment内部嵌套Fragment的能力)是Android 4.2提出的,support-fragment库可以兼容到1.6。通过getChildFragmentManager()能够获得管理子Fragment的FragmentManager,在子Fragment中可以通过getParentFragment()获得父Fragment。
四,在Activity使用Fragment:
(一)静态方式,缺点是一旦添加就不能在运行时删除。
<fragment
android:name="laobi.com.home.fragment.Fragment1_Home"
android:id="@+id/fragment1"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
(二)动态方式
- 采用replace替换fragment的方式,节省内存,因为每次切换,都会回收上一个fragment
// 1,获取fragmentManager
FragmentManager fragmentManager = getSupportFragmentManager();
// 2,开启事物
FragmentTransaction tr = fragmentManager.beginTransaction();
// 3,替换容器中的内容
Fragment1_Home fragment= new Fragment1_Home();
tr.replace(R.id.container, fragment);
//4,提交事物
tr.commit();
五,向Fragment传值.
3.1,在创建Fragment时要传入参数,必须要通过setArguments(Bundle bundle)方式添加,而不建议通过为Fragment添加带参数的构造函.
3.2, 因为通过setArguments()方式添加,在由于内存紧张导致Fragment被系统杀掉并恢复(re-instantiate)时能保留这些数据。官方建议如下:
public class Fragment1_Home extends BaseHomeFragment {
public static Fragment newInstance(Bundle bundle) {
Fragment1_Home fragment1 = new Fragment1_Home();
fragment1.setArguments(bundle);
return fragment1;
}
3.3,我们可以在Fragment的onAttach()中通过getArguments()获得传进来的参数,并在之后使用这些参数。
六,Fragment回退栈
1,对于Activity,当按返回键时,能够返回到上一个Activity,但是,当我们Fragment到Activity中时,如果不做任何处理,当按返回键时,当前Fragment都会全部退出.
如果想要拥有Activity逐渐退出的效果,我们需要应用一下Fragment中的回退栈.
2,大家可以自行打开京东,你会发现,如果你点击了分类,发现,购物车,我的,按钮,再按返回键的话,会先回到首页,然后再退出应用.这里应用的就是Fragment的回退栈功能
3,重要方法:
3.1,addToBackStack(tag); 将Fragment添加到回退栈中
3.2,popBackStack(); 清除回退栈中栈顶的Fragment
3.3,popBackStack(String tag, int i );
如果i=0,回退到该tag所对应的Fragment层
如果i=FragmentManager.POP_BACK_STACK_INCLUSIVE,回退到该tag所对应的
Fragment的上一层
3.4,popBackStackImmediate 立即清除回退栈中栈顶Fragment
3.5,getBackStackEntryCount(); 获取回退栈中Fragment的个数
3.6,getBackStackEntryAt(int index) 获取回退栈中该索引值下的Fragment
回退栈代码实现:Android之Fragment回退栈详解
借鉴:
1,Android Fragment生命周期
https://blog.****.net/wccchangchun/article/details/51203640
2,Android基础:Fragment,看这篇就够了
https://www.jianshu.com/p/28ca4cbe190c
3,Android Fragment 非常详细的一篇
https://www.jianshu.com/p/11c8ced79193