您的当前位置:首页正文

浅谈 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 状态

一旦通过FragmentTransaction做出修改必须 commit() 进行提交 才能生效
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 的使用这里我们先介绍基础性的知识,也没有给大家介绍具体的代码,因为我认为对于这个东西,先要去理解它,当你再去看代码就能很好的使用了。