Fragment

来源:互联网 发布:淘宝客佣金 编辑:程序博客网 时间:2024/05/21 04:16

说点废话:

关于这一天的到来,真的等了太久了。

对于Android的学习,我总是断断续续,就跟玩LOL的时候很少一波推完一样。其中时间停顿最长的大概就是Fragment了。数次想开始学习,却数次停下来。

是因为它和Activity的相似性和关联性?还是因为又要记住一个生命周期?又或许是部分功能通过子Activity也可以直接实现?

总之我就是不愿意学它,导致学习进度一再搁浅。

不过,这一天终归是来了,我终于完成了对Fragment初步的学习,可以进行一些浅显的总结了。

不过我并不打算进行演示了。因为,我机器炸了..

是的没错….

炸了!

虚拟机打不开!! 打不开还怎么截图!!!

Android平板也炸了!!! 炸了!!!!

最近就没一件顺心的事…….

好,那么废话说完了,开始总结。


概述

Android系统运行在各种各样的设备中,小到各种尺寸的手机大到平板甚至电视。在开发时,为了做到一个App同时适应手机和平板,在Android3.0时引入了Fragment。

Fragment代表了Activity的子模块,我们可以把Fragment理解成Activity片段。它拥有自己的生命周期,也可以接受自己的输入事件。我们可以将Activity作为Fragment的一个容器和控制器,动态的添加、替换和移除某个Fragment。

一个Activity可以同时组合多个Fragment,一个Fragment也可以被多个Activity复用。


Fragment的简单使用

Fragment和Activity在某些方面是很相似的,当我们实现Fragment的时候必须继承Fragment基类或它的任意子类(DialogFragmentListFragmentPreferenceFragmentWebViewFragment)。接下来它们也和Activity一样需要实现一些回调方法,例如onCreate()、onCreateView()、onStart()、onPause()等。

通常为了控制Fragment显示的组件,会重写onCreateView()。当Fragment绘制界面组件时将会回调该方法,该方法会返回一个View作为该Fragment显示的View组件。

演示:

1.首先要在/res/layout/目录下创建两个Fragment的布局文件,这里命名为fragment_leftfragment_right

fragment_left:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="#00ff00"    andorid:orientation="vertical">    <Button        android:id="@+id/button"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_horizontal"        android:text="替换"        /></LinearLayout>

fragment_right:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="#ffff00"    andorid:orientation="vertical">    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_horizontal"        android:text="这是右Fragment"        /></LinearLayout>

2.新建两个Java类继承自Fragment,重写onCreateView()代码;

LeftFragment:

public class LeftFragment extends Fragment{    @Override    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){    View view=inflater.inflate(R.layout.fragmet_left,container,false);    return view;}

RightFragment:

public class RightFragment extends Fragment{    @Override    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){    View view=inflater.inflate(R.layout.fragmet_right,container,false);    return view;}

3.修改activity_main代码,通过android:name属性来显式指明要添加的碎片类名(要将类的包名也加上)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">    <fragment        android:id="@+id/fragment_left"        android:name="come.demo.fragment.LeftFragment"        android:layout_width="0dp"        android:layout_height="match_parent"        android:layout_weight="1" />    <fragment        android:id="@+id/fragment_right"        android:name="come.demo.fragment.RightFragment"        android:layout_width="0dp"        android:layout_height="match_parent"        android:layout_weight="1" /></LinearLayout>

这就是Fragment的静态创建方法了。


Fragment管理与Fragment事务

Activity主要通过FragmentManager来管理Fragment,例:

  • 使用findFragmentById()findFragmentByTag()来获取指定的Fragment。

  • 在Activity运行时,可通过FragmentManager的beginTransaction()方法开启并返回FragmentTransaction对象。使用该对象的add()、remove()、replace()方法动态地添加、删除或替换Fragment。

  • 调用popBackStack()方法将Fragment从后台栈中弹出。

  • 调用addOnBackChangeListener()注册一个监听器,用于监听后台栈的变化。

:当调用FragmentTransaction的add()等方法对Fragment进行修改后,要记得调用它的该Transaction的commit()方法对改动进行提交。

FragmentTransaction也被称作Fragment事务,代表了Activity对Fragment执行的多个改变操作。

例:

动态添加fragment

  1. 创建待添加的碎片实例。
  2. 获取到FragmentManager,在Activity中调用getFragmentManager()方法得到。
  3. 调用beginTransaction()方法开启一个事务。
  4. 向容器内加入碎片,一般使用replace(),需要在其中传入容器的id和待添加的碎片实例。
  5. 通过commit()方法提交事务。

Fragment生命周期

Fragment必须被“嵌入”Activity中使用,所以虽然它有自己的生命周期,但Fragment的生命周期会受到它所在的Activity的生命周期控制。

当Activity暂停时,该Activity内所有的Fragment都会暂停;当Activity被销毁时,该Activity内所有的Fragment都会被销毁。只有当Activity处于活动状态时,里面的Fragment才可以被操作。

与Activity类似,Fragment也存在以下四种状态:

  • 运行状态:当前Fragment位于前台,用户可见,可以获得焦点。
  • 暂停状态:其他Activity位于前台,该Fragment依然可见,只是不能获得焦点。
  • 停止状态:该Fragment不可见,失去焦点。
  • 销毁状态:该Fragment被完全删除,或该Fragment所在的Activity被结束。

下面上图!

这里写图片描述

由图可知,在Fragment的生命周期中,这些方法会被系统回调。

  • onAttach():当该Fragment被添加到Activity时被回调。这个方法只会被调用一次。

  • onCreate(Bundle savedStatus):创建Fragment时被回调。该方法也只会被调用一次。

  • onCreateView():每次创建和绘制该Fragment的View组件时回调该方法,Fragment将会显示该方法返回的View组件。

  • onActivityCreated():当Fragment所在的Activity被启动完成后回调该方法。

  • onStart():启动Fragment时被回调。

  • onResume():恢复Fragment时被回调,与Activity的生命周期类似,在onStart()方法后一定会回调onResume()方法。

  • onPause():暂停Fragment时被回调。

  • onStop():停止Fragment时被回调。

  • onDestroyView():销毁该Fragment所包含的View组件时调用。

  • onDestroy():销毁Fragment时被调用。该方法只会被调用一次。

  • onDetach():将该Fragment从Activity中删除、替换完成时回调该方法,在onDestroy()方法后一定会回调onDetach()方法。该方法也只会被调用一次。

对大部分Fragment来说,通常都会重写onCreate()、onCreateView()、onPause()方法。我们在实际开发中可以根据需要自己重写其他的回调方法。


这就是一些我对Fragment的浅显总结,由于机器原因和自身水平限制,在演示部分我并没有做多少。所以我决定贴上三篇我看了多遍的郭霖前辈的博文,供自己也供某个有缘看我博客的人查看。

Android Fragment完全解析,关于碎片你所需知道的一切|郭霖

Android手机平板两不误,使用Fragment实现兼容手机和平板的程序|郭霖

Android Fragment应用实战,使用碎片向ActivityGroup说再见|郭霖


知识点参考自Android官方文档、《疯狂Android讲义》| 李刚以及《第一行代码》|郭霖

3 0
原创粉丝点击