Fragment之静态绑定和动态绑定
静态绑定
1.首先需要写一个类继承自Fragment,这个类可以直接通过AN自带的生成就可以。
2.这个类里面大概有四个重写的方法
先简单介绍一下吧,第一个方法获取一个对象,第二个方法也是核心方法,用来获取控件设置属性和监听事件的,第三个方法是在碎片所在的容器加载完毕之后执行的方法
第四个方法是在碎片所在的活动创建完成之后执行的方法。
对于静态绑定碎片来说,首先需要一个xml文件用来描述你的碎片内部是什么样的,自动生成的布局文件如下:
这里需要说明,这个Fragment所对应的xml文件需要一个根布局,可以是RelativeLayout也可以是LineLayout,这里使用的是FrameLayout
写完之后我们需要一个Activity,毕竟Fragment需要存活在Activity里面嘛,最后在我们的activity所对应的xml文件里面引入Fragment标签或者FragmentContainerView标签(官方推荐的,是新版的
注意:在Fragment标签里面需要表明id属性或者tag属性,在FragmentContainerView标签里面必须声明id属性,tools属性可以预览到碎片类xml的样式,name属性对应我们创建类的包名
最后一点小区别关于Fragment标签和FragmentContainerView标签,FragmentContainerView输入tools和name不会给你提示对应的布局文件和包名,即不能预览和快速输入,不过都能实现对应效果。、
讲完静态绑定之后,说一下动态绑定
首先动态绑定也需要和静态绑定一样创建一个继承自Fragment的类,并且书写对应的fragment对应的xml文件,然后相比于直接在活动的xml文件里面引入fragment标签
我们这里采用的是先在活动里面创建一个子布局标签,然后通过FragmentManager对象和FragmentTransaction对象将碎片放到子布局标签里面
具体的实现代码如下所示
这里面有很多需要说的东西
首先是getSupportFragmentManager()方法,这个方法是FragmentActivity以及它的子类才拥有的方法
通过翻源码,我们也能发现,我们平时创建的活动页面都是继承自AppCompatActivity,所以我们的活动是可以用getSupportFragmentManager()这个方法的
获取到管理对象之后,在通过开启事务的方法返回一个fragmentTransaction对象,通过这个事务对象就可以实现增加修改等一系列的操作。
add()方法有三个参数,第一个参数是一个int类型的,对应我们活动页面的子布局标签,在这里我的子布局如下所示:
当然,我们这里使用LineLayout和RelativeLayout标签也是可以的,官方推荐我们使用这个新版的标签
add方法的第二个参数有两种写法,每种写法对应一个第三个参数类型
首先第一种写法是传入Fragment.class,使用反射的方式,这么做有一个好处,当碎片在被创建和被恢复的时候,都会执行BlankFragment(我们创建的继承自Fragment的类,这里以BlankFragment作为例子)的构造方法。 我们可以看到,当使用反射的时候,第三个参数可以如下图所示
如果使用反射的方式,那么第三个参数对应的是一个参数类型的,这里我们可以使用Bundle包裹传递键值对,然后在碎片类的onCreate方法里面接收包裹的数据
如果add方法的第二个参数传递的是一个Fragment对象,第三个参数是一个String类型的,我们可以看到这个参数是一个标签,也就是我们可以通过标签名找到对应的碎片控件或者布局控件
还有一个方法叫addToBackStack();这个方法设置为true之后,点击返回键不会直接跳出我们当前的activity,而是退出这个碎片。最后commit()方法进行提交操作。
最后在这里说一下碎片和活动生命周期的联系
首先是静态绑定,先创建碎片后创建活动
而动态绑定,是先创建活动,执行onCreate方法之后,再执行碎片的构造器、oncreate、onCreateView、onViewCreated、onActivityCreated、onStart
然后是活动的onStart方法和onResume方法,其次才是碎片的onResume方法,在销毁的时候是先执行碎片的onDestory再执行活动的onDestory
对于Fragment来说,使用FragmentTranstaion事务对象可以进行add、remove 、findFragmentById or Tags
当我们通过方式二进行动态碎片的添加时,这里用到了栈,系统会把碎片添加至栈中,我们可以通过manager对象,调用findFragmentById方法找到对应的Fragment
如果想要移除碎片、可以使用FragmentTransaction 对象的remove 方法
进行移除、这里需要注意、这个方法只是从页面上进行了移除、在栈中依然还存在、所以如果在栈中存在2个或两个以上的碎片、那么点击返回键并不会跳出当前的Activity
而是将栈顶的Fragment弹出、当然如果栈里有碎片,可以通过findFragmentByIdOrTags获取到相应的碎片。