一、关于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. CentOS7下安装配置MariaDB

    参考: http://www.2cto.com/os/201504/394141.html http://outofmemory.cn/code-snippet/2533/mysql-create-d ...

  2. getAttribute、setAttribute、removeAttribute

    1.函数语法 elementNode.attributes:属性返回包含被选节点属性的 NamedNodeMap. elementNode.getAttribute(name):方法通过名称获取属性的 ...

  3. CA扫盲的巅峰之作!!!

    ★ 先说一个通俗的例子 考虑到证书体系的相关知识比较枯燥.晦涩.俺先拿一个通俗的例子来说事儿. ◇ 普通的介绍信 想必大伙儿都听说过介绍信的例子吧?假设 A 公司的张三先生要到 B 公司去拜访,但是 ...

  4. es6要用严格模式

    实验let的块级作用域,在sublime的Tools--Babel--Babel Transform检测未出现错误,在html中也未出现错误,唯在控制台中一直报错. //js名为es6.js ---* ...

  5. php五种常见的设计模式(转载)

    很多人都想着写博客来记录编程生活中的点滴,我也不例外,但想了好长时间不知道写什么........万事开头难,先转载一篇吧..... 设计模式 一书将设计模式引入软件社区,该书的作者是 Erich Ga ...

  6. javase-->基础知识(一)

    1.JDK安装和和配置 1)安装jdk1.8版本(不同的平台安装不同的jdk). 2)配置:将.../jdk1.x/bin放到path环境变量的最前面(避免之前配的环境变量干扰). ****** ja ...

  7. ORA-27492 无法运行作业,调度程序不可用

    ORA-27492:无法运行作业;调度程序不可用 ORA-06512: at "SYS.DBMS_ISCHED", line 185 ORA-06512: AT SYS.DBMS_ ...

  8. SVN使用教程之-分支/标记 合并 subeclipse (转)

    首先说下为什么我们需要用到分支-合 并.比如项目demo下有两个小组,svn下有一个trunk版.由于客户需求突然变化,导致项目需要做较大改动,此时项目组决定由小组1继续完成原来正 进行到一半的工作[ ...

  9. 特征描述算子-sift

    特征描述算子-sift http://boche.github.io/download/sift/Introduction%20to%20SIFT.pdf

  10. Eclipse启动时发生An internal error occurred during: "Initializing Java Tooling".错误的解决方法

    问题描述: Eclipse启动时发生An internal error occurred during: "Initializing JavaTooling".错误的解决方法 解决 ...