Fragment笔记
Fragment基本使用
-
1.静态加载
-
通过在Activity的layout文件中声明Fragment
-
(1)、在Activity的layout文件中声明
<fragment />
(注:标签内name属性指定了在layout中实例化的Fragment类,同时必须为Fragment标识唯一的id属性或tag属性)。 - (2)、建立Fragment对应的布局文件。
-
(3)、实现自定义的Fragment类,必须继承Fragment或者Fragment的子类(DialogFragment,ListFragment,PreferenceFragment,WebViewFragment)。
必须实现的回调函数: -
当第一次绘制Fragment的UI时系统调用这个方法,必须返回一个View,如果Fragment不提供UI也可以返回null。
- 注意:如果继承自ListFragment,onCreateView()默认的实现会返回一个ListView,所以不用自己实现。
onCreateView() //返回View对象,可调用inflater.inflate(resource,root,attactToRoot) //resource:Fragment需要加载的布局文件 //root:加载layout的父ViewGroup //attactToRoot:false,不返回父ViewGroup
-
- 系统在创建Fragment的时候调用这个方法,这里应该初始化相关的组件,一些即便是被暂停或者被停止时依然需要保留的东西。
onCreate()
-
- 当用户离开Fragment时第一个调用这个方法,需要提交一些变化,因为用户很可能不再返回来。
onPause()
- 当用户离开Fragment时第一个调用这个方法,需要提交一些变化,因为用户很可能不再返回来。
-
(4)、当在Activity的Java文件中调用已添加好Fragment标签的布局文件时,系统自动实例化Fragment类并调用
onCreateView()
方法,获取到相应的布局文件,同时在Activity中可以通过findViewById()
方法获取到Fragment加载的布局中相应的控件。
-
2.动态加载
-
通过撰写代码将Fragment添加到一个Activity layout中
- (1)、开启一个Fragment事务
-
- 在Activity的Java代码中调用
getFragmentManager()
方法获取一个FragmentManager对象,通过FragmentManager对象调用beginTransaction()
方法获取到一个FragmentTransaction对象。
- 在Activity的Java代码中调用
-
(2)、事务处理:每一个事务执行一个或一套变化,包括add()、remove()、replace(),最后调用commit()方法提交给Activity。
-
- 添加Fragment到布局中去
add(containerViewId, fragment) /** * containerViewId:加载fragment的布局id * fragment:Fragment对象 */
- 添加Fragment到布局中去
-
(3)、回退效果,在
commit()
方法前调用addToBackStack()
方法
Fragment生命周期
-
1.Fragment的生命周期依赖Activity的生命周期,参见下图
-
2.Fragment的各个回调方法的解释
onAttach()
当Fragment被添加到Activity时候会回调这个方法,并且只调用一次onCreate()
创建Fragment时会回调,只会调用一次onCreateView()
每次创建都会绘制Fragment的View组件时调用onActivityCreated()
当Fragment所在的Activty启动完成后调用onStart()
启动FragmentonResume()
恢复Fragment时会被回调,调用onStart()方法后面一定会调用onResume()方法onPause()
暂停FragmentonStop()
停止FragmentonDestroyView()
销毁Fragment所包含的View组件时回调onDestroy()
销毁Fragment时会被回调onDetach()
Fragment从Activity中删除时会回调该方法,并且这个方法只会调用一次
-
3.案例:启动Fragment——>屏幕锁屏——>屏幕解锁——>切换到其他的Fragment——>回到桌面——>回到应用——>退出Fragment
-
(1)、
启动Fragment
onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume() -
(2)、
屏幕锁屏
onPause()->onStop() -
(3)、
屏幕解锁
onStart()->onResume() -
(4)、
切换Fragment
onPause()->onStop()->onDestroyView() -
(5)、
返回原先的Fragment
onCreateView->onActivityCreated()->onStart()->onResume() -
(6)、
回到桌面
onPause()->onSaveInstanceState()->onStop() -
(7)、
回到Activity
onStart()->onResume() -
(8)、
退出Fragment
onPause()->onStop()->onDestroyView()->onDestroy()->onDetach()
Fragment与Activity间通信
1.Activity向Fragment传递数据
- 两者之间通过Bundle数据包通信
-
- (1)、在Activity的Java代码中new一个Bundle对象,并放入数据
-
- (2)、动态加载Fragment,方法在上已述
-
-
(3)、定义接受信息的Fragment类,同时调用
getArguments().get(key)
获取数据
-
(3)、定义接受信息的Fragment类,同时调用
- 通过Fragment自定义方法来通信
-
- (1)、静态加载Fragment,方法在上
-
-
(2)、在Activity的Java代码调用
getFragmentManager()
获取FragmentManager对象,并调用对象中的findFragmentById()
或findFragmentByTag()
方法来获取Fragment对象
-
(2)、在Activity的Java代码调用
-
- (3)、强制转换获取到的Fragment对象为自己自定义的Fragment,就可调用自定义的方法来进行通信。 如:在Fragment类中定义String成员变量,提供set和get方法,在Activity中就可调用set方法修改变量值
2.Fragment向Activity传递数据
- 通过在Fragment类中定义内部回调接口,在Activity中实现该接口实现通信
- (1)、在Fragment类中定义内部接口,同时定义一个接口对象
-
(2)、在
onAttach()
方法中实例化接口对象 -
public void onAttach(Activity activity) { // TODO Auto-generated method stub listener=(MyListener) activity; super.onAttach(activity); }
- (4)、在Activity中继承该接口,并实现定义的方法
- (3)、可以在Fragment类中调用接口定义的方法来通信了