浅谈 Fragment

作者: 有情绪的仙人掌 | 来源:发表于2017-04-03 16:31 被阅读108次

    本文官网链接blog.didiaoyuan.com

    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 的使用这里我们先介绍基础性的知识,也没有给大家介绍具体的代码,因为我认为对于这个东西,先要去理解它,当你再去看代码就能很好的使用了。

    相关文章

      网友评论

        本文标题:浅谈 Fragment

        本文链接:https://www.haomeiwen.com/subject/qzanottx.html