一,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:
(一)静态方式,缺点是一旦添加就不能在运行时删除。
(二)动态方式
- 采用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向fragment传值
可以使用EventBus,接口回调,也可以使用下面的几种方式:
- 1,方式一:先调用getFragmentManager()对象,然后调用findFragmentById()方法获得目标fragment,将数据传递到目标fragment
//setTextView()是目标fragment自己定义的方法
Fragment fragment_left = getFragmentManager().findFragmentById(R.id.fragment_left);
fragment_left.setTextView(et_frafment.getText().toString().trim())
- 2,方式二: 先调用getFragmentManager()对象,然后调用findFragmentById()方法获得目标fragment,再调用getView()获得目标fragment的view对象,最后调用view的findViewById()获得目标控件
TextView tv_fragment= (TextView)getFragmentManager()
.findFragmentById(R.id.fragment_left).getView().findViewById(R.id.tv_fragment);
- 3,方式三:先调用getActivity()获取所在的activity对象后,然后通过findViewById()找到目标控件(该目标fragment在activity中,所以可以通过activity进行findViewById)
TextView tv_fragment = (TextView)getActivity().findViewById(R.id.tv_fragment);
tv_fragment.setText(et_frafment.getText().toString().trim());
七,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.csdn.net/wccchangchun/article/details/51203640
2,Android基础:Fragment,看这篇就够了
https://www.jianshu.com/p/28ca4cbe190c
3,Android Fragment 非常详细的一篇
https://www.jianshu.com/p/11c8ced79193