浅谈 Fragment
fragment 用户界面管理上用到的地方非常多,fragment 相比 activity ,不同的activity之间有很强的过多效果,fragment 更加轻量级的转变,更加灵活,Fragment 也称作UI Fragment。一下我们通过几个问题来介绍 Fragment。
为什么要使用Fragment,能实现什么?
在实际的开发中,虽然 Activity 可以帮助我们实现不同的页面承载,但是要遵循 Activity 的生命周期,当我们要实现更友好的用户界面,Activity 已经不能满足我们。Fragment 提供更灵活的 UI设计需求,fragment 是一种控制器对象,activity可以委派它完成一些任务,通常是管理用户界面,受管理的用户界面通常是一整屏或是屏幕的一部分。在一些需要在一个activity 进行不同操作的情况下,fragment 就能提供很好的交互。
Fragment 与 Activity 的什么关系?
Fragment 必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期,通过两者的生命周期图来理解,fragment
onAttach()
当Fragment与Activity发生关联时调用。
onCreateView()
创建该Fragment的视图
onActivityCreated(Bundle)
当Activity的onCreate方法返回时调用
onDestoryView()
与onCreateView想对应,当该Fragment的视图被移除时调用
onDetach()
与onAttach相对应,当Fragment与Activity关联被取消时调用
注意:没说的代表跟 activity 相同
如何使用 Fragment?
两种方式
- 布局的方式
- 代码的方式
(一) 布局的方式
<Fragment android:name="在布局中实例化的Fragment 的包名"></Fragement>
当系统构建 Activity 布局时,会实例化在布局指定的 fragment ,并调用 onCreateView()方法。系统会直接插入onCreateView()中返回的 view 来代替<fragment> 标签
注:每个fragment都需要一个唯一的标识符,重启 Activity 时,系统可以使用该标识符来恢复fragment(您也可以使用该标识符来捕获fragment以执行某些事务,如将其移除)。 可以通过三种方式为片段提供 ID:
为 android:id 属性提供唯一 ID。
为 android:tag 属性提供唯一字符串。
如果您未给以上两个属性提供值,系统会使用容器视图的 ID。
对于 Fragment 的理解----------------------------------------------------------------------官方文档
(二)代码的方式
在Activity 运行的过程中,再添加Fragment到指定的ViewGroup
需要通过** FragmentManager **来管理(添加,删除,替换)事务的管理
getSupportFragmentManager().beginTrasaction()
.add(R.id.fragment,fragment)
// 参数1. 指定位置添加,通过资源ID定位
// 参数2.需要添加的 fragment
如果需要 addToBackStack() 将此事务添加到事务返回栈,允许用户按返回键返回上一个 Fragment 状态
.commit
一旦通过FragmentTransaction做出修改必须 commit() 进行提交 才能生效
提示:对于每个片段事务,您都可以通过在提交前调用 setTransition()
来应用过渡动画。
添加没有 UI 的片段
上例展示了如何向您的 Activity 添加片段以提供 UI。不过,您还可以使用片段为 Activity 提供后台行为,而不显示额外 UI。
要想添加没有 UI 的片段,请使用 [add(Fragment, String)](http://developer.android.youdaxue.com/reference/android/app/FragmentTransaction.html#add(android.app.Fragment, java.lang.String))
从 Activity 添加片段(为片段提供一个唯一的字符串“标记”,而不是视图 ID)。 这会添加片段,但由于它并不与 Activity 布局中的视图关联,因此不会收到对 [onCreateView()](http://developer.android.youdaxue.com/reference/android/app/Fragment.html#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle))
的调用。因此,您不需要实现该方法。
并非只能为非 UI 片段提供字符串标记 — 您也可以为具有 UI 的片段提供字符串标记 — 但如果片段没有 UI,则字符串标记将是标识它的唯一方式。如果您想稍后从 Activity 中获取片段,则需要使用 findFragmentByTag()。
onCreateView
inflater,inflate(R.layout.id,container,false);
参数 1.需要填充的布局,
参数 2.填充的布局显示到父ViewGroup
参数 3.指示是否应该在扩展期间将扩展布局附加至(第二个参数)的布尔值。
在本例中,其值为 false,因为系统已经将扩展布局插入
container传递 true 值会在最终布局中创建一个多余的视图组。
Fragment 事务该如何理解?
** 理解 **:每一个继承 Fragment 的类都有与之对应的 XML 视图,这是跟 Activity 相同的地方 ,这个 XML 视图 可以看成一个动态的视图,这个视图跟主视图绑定,当我们进行交互性操作的时候,FragmentManager 管理 fragment 事务 进行添加,移除,替换 ,这个过程中遵循的是 fragment 的生命周期,只要 Activity 处于运行状态,就可以使用一个或者多个fragment 进行 事务的处理。例如:清单列表和详细内容是两个不同的 fragment 构成,先加载的是清单列表 fragment 当用户选中其中一个,触发FragmentManager 进行 替换操作,替换成详细内容fragment。
结束语
fragment 的用法还有许多,包括与ViewPager 和 FragmentPagerAdapter 的使用这里我们先介绍基础性的知识,也没有给大家介绍具体的代码,因为我认为对于这个东西,先要去理解它,当你再去看代码就能很好的使用了。