一 Fragment简介
Activity分成不同的组成部分,这些组成部分拥有自己的生命周期和UI。
它的最大用途在于适配不同的屏幕。
创建Fragment
和Activity有很多相似之处,例如可以不带UI,但这样做对两者似乎都没什么意义。他们的创建方式也很相似,例如下面的代码:
三 Fragment生命周期
Fragment的生命周期和它的宿主Activity密切相关,几乎和宿主Activity的生命周期一致,
他们之间最大的不同在于Activity可以增加或删除Fragment。下图总结了Fragment的生命周期:
四 获取Fragment Manager
Activity对象都内置了一个FragmentManager对象,使用getFragmentManager()即可获得:
FragmentManager fragmentManager = getFragmentManager();
五 添加Fragment到Activity中
在Activity中添加Fragment的最简单方法是使用layout配置文件,例如:
调用inflate方法生成Fragment的界面后,Fragment实际上是一个类似ViewGroup的角色,在Activity中管理自己的UI。
上面那种将Fragment添加到Activity的方法缺乏灵活性,不能实现动态地添加和删除,
更好的方式是使用FragmentTranaction和类似下面这样的配置文件:
六 使用FragmentTransaction
FragmentTransaction可以在运行时添加,删除或替换Fragment,从而实现UI的动态变化。
Fragment Transaction由Fragment Manager的beginTransaction()方法创建,
然后可以进行Fragment的添加,删除和替换,最后通过commit()方法提交修改。
Fragment
使用FragmentTransaction的add方法可以添加一个新的Fragment,add()方法的主要参数是Fragment的容器View(或其ID)及Fragment实例,例如:
删除Fragment需要FragmentTransaction的remove()方法,参数为Fragment对象,Fragment对象可以通过FragmentManager的findFragmentById()方法获得。
替换Fragment使用的是FragmentTransaction的replace()方法,参数分别为所要替代Fragment所在容器的ID和新的Fragment:
八 获取指定的 Fragment
删除 Fragment 容器
在配置文件中将visibility的属性设为"gone",即可删除某个Fragment,例如:
Fragment和 Back Stack
Activity拥有Activity Stack,从而在用户按”返回”按钮时,回到前一个Activity。Fragment也可以响应”返回”事件,方法是FragmentTransaction在commit之前调用addToBackStack()方法。这样,在用户按返回键后,Android会首先重现之前的UI布局。
原理和Activity类似,调用addToBackStack()后,Fragment会被push到back stack中,而不是销毁。
Fragment Transaction的动画效果
有两种方法实现动画效果,分别是
11.1 设置渐进: transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
11.2 设置动画效果:
fragmentTransaction.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_out_right);
十二 Fragment和宿主Activity之间的接口
12.1 Fragment可以通过getActivity()方法获得宿主Activity对象:
TextView textView = (TextView)getActivity().findViewById(R.id.textview);
12.2 另一种常见的Fragment和Activity之间的交互方式是使用回调函数:
十三 没有UI的Fragment
尽管不常见,但Fragment的确是可以没有UI的,好处也许是拥有了更灵活的生命周期控制。没有UI的Fragment生命周期事件有这些:
十四 常用的Fragment类
14.1 DiagFragment
14.2 ListFragment
14.3 webViewFragment