浅谈Android中的 Fragment 以及使用
Fragment 是个什么东西?
可以把Fragment理解成Activity中的模块,这个模块有自己的布局,有自己的生命周期,单独处理自己的输入,在Activity运行的时候可以加载或者移除Fragment模块。还可以覆盖前面的一个页面,加载想要的模块
Fragment介绍:
Android是在Android 3.0 (API level 11)开始引入Fragment的,要么用全部用app,要么全部用v4(3.0以下需要导入的包),不然可是会报错的!
那么如果开发的app需要在3.0以下的版本运行呢?比如还有一点点市场份额的2.3!
于是乎,v4包就这样应运而生了,而最低可以兼容到1.6版本!至于使用哪个包看你的需求了,不过现在几乎都是
4.0以上的,所以这个时候,你可以直接使用app包下的Fragment,然后调用相关的方法通常都是不会有什么问题的
使用v4包要注意的事项:
①如果你使用了v4包下的Fragment,那么所在的那个Activity就要继承FragmentActivity哦!
案例:今天在xml文件中静态地载入fragment,然后重写了Fragment,但是在加载Activity的时候就报错了,
大概的提示就是Fragment错误还是找不到什么的,name属性改了几次还是错!最后才发现是用了
v4的包的缘故,只需让自己的Activity改成FragmentActivity即可!
Fragment 生命周期? Activity生命周期:
作用:fragment已经关联到activity,这个时候 activity已经传进来了, 获得activity的传递的值 就可以进行 与activity的通信里, 当然也可以使用getActivity(),前提是这个fragment已经和宿主的activity关联,并且没有脱离,有且只有调用一次。
这些个变量主要是:当你 暂停 停止的时候 你想保持的数据
他只调用一次。
3.onCreateView()
第一次使用的时候 fragment会在这上面画一个layout出来, 为了可以画控件 要返回一个 布局的view,也可以返回null j 就什么都没有显示。
当系统用到fragment的时候 fragment就要返回他的view,越快越好 ,所以尽量在这里不要做耗时操作,比如从数据库加载大量数据
4onActivityCreated()
当Activity中的onCreate方法执行完后调用。
注意了:
从这句官方的话可以看出:当执行onActivityCreated()的时候 activity的onCreate才刚完成。
所以在onActivityCreated()调用之前 activity的onCreate可能还没有完成,
所以不能再onCreateView()中进行 与activity有交互的UI操作,UI交互操作可以在onActivityCreated()里面进行。
所以呢,这个方法主要是初始化那些你需要你的父Activity或者Fragment的UI已经被完
整初始化才能初始化的元素。
5.onStart()
和activity一致,启动Fragement 启动时回调,,此时Fragement可见。
6.onResume()
和activity一致 在activity中运行是可见的。激活, Fragement 进入前台, 可获取焦点时激活。
7.onPause()
和activity一致 其他的activity获得焦点,这个仍然可见第一次调用的时候,指的是 用户 离开这个fragment(并不是被销毁)
通常用于 用户的提交(可能用户离开后不会回来了)
8.onStop()
和activity一致, fragment不可见的, 可能情况:activity被stopped了或者 fragment被移除但被,加入到回退栈中,一个stopped的fragment仍然是活着的如果长时间不用也会被移除。
9. onDestroyView()
Fragment中的布局被移除时调用。表示fragemnt销毁相关联的UI布局, 清除所有跟视图相关的资源。
然后这个知识移除视图 并没有销毁而且还没有脱离activity
10.onDestroy()
销毁fragment对象, 跟activity类似了。
11.onDetach()
Fragment和Activity解除关联的时候调用。 脱离activity。
接下来 来模拟一个fragment 的启动 按下home键 销毁等 系统是怎么样调用生命周期,这里用Logcat日志来查看
(XX_Fragment 为Fragment的生命周期 否则为Activity周期)
当现实fragment的时候都先执行activity方法,当销毁的时候都是现执行 fragment的方法,这样更好理解fragment是嵌套在activity中
总结生命周期的回调方法:
1.当一个fragment被创建的时候,它会经历以下状态.。
onAttach()
onCreate()
onCreateView()
onActivityCreated()
2.当这个fragment对用户可见的时候,它会经历以下状态。
onStart()
onResume()
3.当这个fragment进入“后台模式”的时候,它会经历以下状态。
onPause()
onStop()
4.当这个fragment被销毁了(或者持有它的activity被销毁了),它会经历以下状态。
onPause()
onStop()
onDestroyView()
onDetach()
5.就像activitie一样,在以下的状态中,可以使用Bundle对象保存一个fragment的对象。
onCreate()
onCreateView()
onActivityCreated()
6.fragments的大部分状态都和activitie很相似,但fragment有一些新的状态。
onAttached() —— 当fragment和activity关联之后,调用这个方法。
onCreateView() —— 创建fragment中的视图的时候,调用这个方法。
onActivityCreated() —— 当activity的onCreate()方法被返回之后,调用这个方法。
onDestroyView() —— 当fragment中的视图被移除的时候,调用这个方法。
onDetach() —— 当fragment和activity分离的时候,调用这个方法。
解析完了生命周期 以及生命周期的回调方法,接下来看下如何应用。
假设这次有个 侧滑菜单 就是类似QQ 的侧滑菜单 侧滑菜单上的每个item 点击之后都有自己的fragment 但是在使用过程中,如果使用不当,很容易造成 不断的重新加载view 损耗内存空间。
这几天在网上查找了一些frgment 的优化资料,也发现了很多都是问题,自己撸一套自己使用。
介绍具体的几个常用的方法:
FragmentManager fragmentManager = getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
管理Fragment的一些添加 隐藏 替换等操作 需要的。
(注:如果import android.support.v4.app.FragmentManager;那么使用的是:FragmentManager fragmentManager = getSupportFragmentManager())
add()方法加上Fragment的对象
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
一次类推。 replace() show() hide() 等方法都是类似使用。
这里最后看一贴代码,最后的使用
public void switchConent(Fragment from, Fragment to, String title)
{
FragmentTransaction transactio = getSupportFragmentManager().beginTransaction();
// 如果没有加入过
if (!to.isAdded())
{
if (from != null)
{
// 如果不为空 则隐藏
transactio.hide(from);
transactio.addToBackStack(null);
}
// 添加
transactio.add(R.id.content_frame, to);
transactio.commit();
} else
{
if (from != null)
{
transactio.hide(from);
}
/**这里可以写一些用户操作数据的 调用方法*/
// 隐藏当前的fragment,显示下一
transactio.show(to).commit();
}
}
from 从哪个fragment 换到 目标fragment to;
isadded() 判断事都 添加过 如果没有 那可以添加。
逻辑也很简单,隐藏 显示 提交 交互使用。
比较关键的一点 就是如何更新fragment上的UI数据。 这里可以在对应的fragment 里写一些UI操作的方法 然后在 上面那段代码 show(Object).commit() 中调用。
管理 侧滑菜单上的所有 Fragment:
可以用 单例模式和工厂模式 来管理 全部的fragment 防止多次被创建。引用当前显示的fragment作为等下 换页的时候
传入参数的from。
简单的fragment介绍完了。