一、关于Fragmemt

1、Fragment(片段),主要是为了支持更多的动态和灵活的用户界面设计,如平板电脑。Fragment允许组合和交换用户界面组件,而不需要更改视图层次结构。通过把Activity的布局划分成Fragment,可以在运行时修改Activity的外观。

2、Fragment表示Activity中的用户界面的行为或部分。可以将多个Fragment组合在一个Activity中,并在多个活动中重用Fragment。可以把Fragment当作一个Activity的模块部分,有自己的生命周期,接受自己的输入事件。

3、一个Fragment必须始终嵌在一个Activity中,该片段的生命周期直接受宿主Activity的生命周期的影响。例如,当Activity暂停时,所有的Fragment都是这样,当Activity被破坏时,所有的Fragment都被破坏。然而,当一个Activity正在运行,可以独立操作每一个Fragment,如添加删除它们。

二、Fragment生命周期图解

1. 当一个fragment被创建的时候,它会经历以下状态.

  • onAttach()
  • onCreate()
  • onCreateView()
  • onActivityCreated()

2. 当这个fragment对用户可见的时候,它会经历以下状态。

  • onStart()
  • onResume()

3. 当这个fragment进入“后台模式”的时候,它会经历以下状态。

  • onPause()
  • onStop()

4. 当这个fragment被销毁了(或者持有它的activity被销毁了),它会经历以下状态。

  • onPause()
  • onStop()
  • onDestroyView()
  • onDestroy()
  • onDetach()

三、创建Fragment

要创建一个Fragment,你必须创建一个Fragment的子类(或它的一个现有的子类)。

Fragment类的代码看起来很像一个Activity。它含有类似于Activity的回调方法,如oncreate(),onstart(),onpause(),和onstop()。

事实上,如果你将一个现有的安卓应用程序转换为使用Fragment,你可能会将代码从Activity的回调方法转移到你的Fragment的相应的回调方法中。

通常,你应该至少实现以下生命周期方法:
onCreate()
当创建该Fragment时,该系统调用该。在你的实现中,你应该对你想要保留的Fragment进行初始化,然后在暂停或停止的时候,然后重新开始。

onCreateview()
该系统调用这个时候,以绘制其用户界面的第一次。要为你的Fragment绘制一个用户界面,你必须从这个方法中返回一个视图,这是你的Fragment布局的根。如果Fragment不提供用户界面,您可以返回null。

onPause()
该系统将该方法称为用户离开该Fragment(虽然并不总是意味着该Fragment被销毁);通常您应该提交当前用户所做的任何更改(因为用户可能不会回来)。

实例代码如下:

public class PhoneFragment extends Fragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
    }

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

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

四、封装BaseFragment基类

为了实例化View,抽象一个getLayoutId方法,子类无需关心具体的创建操作,父类来做View的创建处理。
同时可以提供一个afterCreate抽象函数,在初始化完成之后调用,子类可以做一些初始化的操作,你也可以添加一些常用的方法在基类,例如ShowToast().
public abstract class BaseFragment extends Fragment {

    protected View view;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (view == null) {
            view = inflater.inflate(getLayoutId(), container, false);
            ButterKnife.bind(this, view);
        }
        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        afterCreate(savedInstanceState);
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        ButterKnife.unbind(this);
    }

    protected abstract int getLayoutId();//获取布局

    protected abstract void afterCreate(Bundle savedInstanceState);//初始化布局
}

 五、使用静态工厂方法newInstance(...)来获取Fragment实例

可以在Google的代码中发现这种写法,好处是接收确切的参数,返回一个Fragment实例,避免了在创建Fragment的时候无法在类外部知道所需参数的问题,在合作开发的时候特别有用。
还有就是Fragment推荐使用setArguments来传递参数,避免在横竖屏切换的时候Fragment自动调用自己的无参构造函数,导致数据丢失。
public class SecondFragment extends BaseFragment implements View.OnClickListener {

    public static SecondFragment getInstance(String data){
        return new SecondFragment();
    }

    @Override
    protected int getLayoutId() {
        return R.layout.fragment_second;
    }

    @Override
    protected void afterCreate(Bundle savedInstanceState) {
        //布局初始化
    }

    @Override
    public void onClick(View v) {
    }
}

如果后一个页面不需要用到前一个页面的太多数据,推荐用Activity展示,否则最好用Fragment( 当然这也不是绝对的)。

Android :fragment介绍的更多相关文章

  1. Android Fragment 实例

    Fragment是Android honeycomb 3.0新增的概念,在Android——Fragment介绍.Android Fragment使用.Android FragmentManage F ...

  2. Fragment、Activity比较——Android碎片介绍

    Fragment是Android honeycomb 3.0新增的概念,Fragment名为碎片不过却和Activity十分相似,下面介绍下Android Fragment的作用和用法.Fragmen ...

  3. 【Android自学日记】【转】Android Fragment 真正的完全解析(下)

    上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和各种API,如果你还不了解,请看:Android Fragment 真正的完全解析(上). 本篇将介绍上篇博客提到的:如何管理Frag ...

  4. Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理

    Toolbar作为ActionBar使用介绍 本文介绍了在Android中将Toolbar作为ActionBar使用的方法. 并且介绍了在Fragment和嵌套Fragment中使用Toolbar作为 ...

  5. Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复

    Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...

  6. Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常见错误

    嵌套Fragment的使用及常见错误 嵌套Fragments (Nested Fragments), 是在Fragment内部又添加Fragment. 使用时, 主要要依靠宿主Fragment的 ge ...

  7. Android Fragment 真正的完全解析(下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和 ...

  8. Android Fragment完全解析

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8881711 我们都知道,Android上的界面展示都是通过Activity实现的, ...

  9. Android Fragment 解析和使用

    Android Fragment的生命周期和Activity类似,实际可能会涉及到数据传递,onSaveInstanceState的状态保存,FragmentManager的管理和Transactio ...

随机推荐

  1. Windows Server 2008 双网卡同时上内外网 不能正常使用

    Windows server 2008 32位下,双网卡同时上内外网,并提供VPN服务,遇见的奇怪问题 1.服务器配置 2.网络配置 以太网适配器 内部连接: 连接特定的 DNS 后缀 . . . . ...

  2. SemanticZoom配合GridView组件的使用关键点

    1,SemanticZoom 有两个重要属性 默认值ZoomedInView(不设置的话,默认显示,包括分类名和分类成员)和ZoomedOutView(这个是缩小后的目录,只要包括分类名,点击跳到对应 ...

  3. 鼠标划过用户名时在鼠标右下角显示div展示用户资料

    最近做一个网站论坛,为了方便会员之间相互了解,又不想再做一个页面展示用户资料,就想到了鼠标划过用户名时在鼠标右下角显示div展示用户资料这个效果, 这里要注意的该方法不是给每个用户名的旁边都绑定一个d ...

  4. WPF去边框与webbrowser的冲突

    首先建一个类,比如NativeMethods.cs class NativeMethods{     public const int WS_CAPTION=0x00C0000;     public ...

  5. 一篇很好的Java、C、PHP、前端、Android、IOS的文章

    http://www.cctime.com/html/2016-11-8/1238265.htm 很好的讲了这些技术的学习路线,其中的文档资料很丰富,值得学习参考

  6. wps恢复经典模式

    经典模式 情况一: 恢复的方法:点击红色区域 情况二: 恢复的方法:点击红色区域

  7. mysql深入浅出的笔记(存储过程一)

    1.存储过程和函数....    存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程和函数可以简化应用开发人员的很多工作,    减少数据在数据库中和应用服务器之间的传说 ...

  8. php 批量删除

    <body><form action="shanchu.php" method="post"><table width=" ...

  9. F#之旅8 - 图片处理应用之动画二维码

    首先,先介绍下什么是动画二维码.前些天在网上闲逛,突然看到一个开源项目,发现一种二维码的新玩法.https://github.com/sylnsfar/qrcode/blob/master/READM ...

  10. 学习微信小程序之css4设置颜色,单位表示,字体样式

    颜色的设置可以通过RGB设置 可以直接通过英文单词设置 可以通过16进制来设置 长度单位: 字体样式: 设置字体样式 字体粗细 设置字体风格 设置字间距