【Android应用开发技术:应用组件】Fragment基本原理

作者:郭孝星

微博:郭孝星的新浪微博

邮箱:[email protected]

博客:http://blog.csdn.net/allenwells

Github:https://github.com/AllenWells

如果我们的App设计成要支持范围广泛的屏幕尺寸时,在可利用的屏幕空间内,我们可以通过在不同的布局配置中重用你的Fragment来优化我们的用户体验。一个手机设备可能适合一次只有一个Fragment的单面板用户交互。相反,在更大屏幕尺寸的平板电脑上,我们可能更想要两个Fragment并排在一起,用来向用户展示更多信息。

如下图所示:

Fragment是Activity模块化的一部分,它拥有自己的生命周期,接收自己的输入事件,可以在Activity运行中被添加和移除,也可以被多个Activity所复用。

一 Fragment的特性

总的说来,Fragment具备以下特性:

  • Fragment总是作为Activity界面的组成部分,Fragment可调用getActivity()方法获取它所在的Activity;Activity可以通过FragmentManager的findFragmentById()方法或者findFragmentByTag()方法来获取相应的Fragment。
  • 在Activity运行过程中,可以通过FragmentManager的add()、remove()和replace()方法来添加、删除或替换Fragment。
  • 一个Activity可以同时使用多个Framework,同一个Fragment也可以被多个Activity所复用。
  • Fragment可以响应自己的输入事件,并有自己的生命周期,但是Fragment的生命周期直接被它所属的Activity所控制。

二 Fragment的生命周期和回调方法

Fragment的生命周期

Fragment的生命周期如下图所示:

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

Fragment的回调方法

Fragment的回调方法如下图所示:

  • onAttach():当Fragment被添加到Activity时被回调,该方法只会被调用一次。
  • onCreate():系统创建Fragment对象后回调该方法,实现代码中只初始化需要在Fragment中保持的必要组件,当Fragment被暂停或者停止后可以恢复。该方法只会被调用一次。
  • onCreateView():当Fragment绘制界面组件时会回调该方法,该方法返回一个View,这个View就是Fragment所显示的View。
  • onActivityCreated():当Fragment所在的Activity启动完成后回调该方法。
  • onResume():恢复Fragment时被回调,onStart()调用之后一定会调用onResume()方法。
  • onPause():当用户离开该Fragment时会回调该方法。
  • onDestory():销毁Fragment时被回调,该方法只会被调用一次。
  • onDetach():将该Fragment从Activity中删除,被替换完成时会回调该方法,onDestory()方法调用后一定会回调onDetach()方法,该方法只会被调用一次。

下面我们通过一个例子来演示Fragment的生命周期和回调方法的调用过程。

主程序界面如下所示:

自定义的Fragment的各个回调方法都加入了打印来观察回调方法的变化情况,源码如下所示:

Fragment生命周期与回调方法演示用例下载

LifecycleFragment源码

package org.crazyit.app;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class LifecycleFragment extends Fragment
{
    final String TAG = "LifecycleFragment";

    @Override
    public void onAttach(Activity activity)
    {
        super.onAttach(activity);
        // 输出日志
        Log.d(TAG, "-------onAttach------");
    }

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        // 输出日志
        Log.d(TAG, "-------onCreate------");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle data)
    {
        // 输出日志
        Log.d(TAG, "-------onCreateView------");
        TextView tv = new TextView(getActivity());
        tv.setGravity(Gravity.CENTER_HORIZONTAL);
        tv.setText("测试Fragment");
        tv.setTextSize(40);
        return tv;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);
        // 输出日志
        Log.d(TAG, "-------onActivityCreated------");
    }

    @Override
    public void onStart()
    {
        super.onStart();
        // 输出日志
        Log.d(TAG, "-------onStart------");
    }

    @Override
    public void onResume()
    {
        super.onResume();
        // 输出日志
        Log.d(TAG, "-------onResume------");
    }

    @Override
    public void onPause()
    {
        super.onPause();
        // 输出日志
        Log.d(TAG, "-------onPause------");
    }

    @Override
    public void onStop()
    {
        super.onStop();
        // 输出日志
        Log.d(TAG, "-------onStop------");
    }

    @Override
    public void onDestroyView()
    {
        super.onDestroyView();
        // 输出日志
        Log.d(TAG, "-------onDestroyView------");
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();
        // 输出日志
        Log.d(TAG, "-------onDestroy------");
    }

    @Override
    public void onDetach()
    {
        super.onDetach();
        // 输出日志
        Log.d(TAG, "-------onDetach------");
    }
}

第一次点击加载目标Fragment

进入应用后,我们首先点击加载目标Fragment,我们会发现Fragment会先onAttach()添加到当前Activity,创建完成后调用onResume(),函数调用链如下图所示:

第二次点击加载目标Fragment

当我们再次点击加载Fragment时,原来的Fragment会被销毁,新的Fragment会被创建,函数调用链如下所示:

点击启动对话框风格的Activity

当Fragment已经创建,我们再去点击启动对话框风格的Activity,对话框启动后,Activity处于Pause状态,那么从属于它的Fragment自然也会处于Pause状态,如下图所示:

当对话框退出后,Activity恢复,Fragment也随之恢复,如下图所示:

点击替换目标Fragment并加入Back栈

当我们点击替换目标Fragment并加入Back栈,此时Fragment虽然不可见,但是没有被销毁,它只是被添加到后台的Back栈,如下图所示:

当用户按下back键时,加入到Back栈的Fragment会再次显示出来,如下图所示:

点击退出

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-02 04:46:37

【Android应用开发技术:应用组件】Fragment基本原理的相关文章

【Android应用开发技术:网络通信】网络服务可发现基本原理

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells Github:https://github.com/AllenWells [Android应用开发技术:网络通信]章节列表 网络服务发现(Network Service Discovery)是一种在局域网内可以辨识并使用其他设备上提供的服务的技术,这种技术在端对端应用(例如:文件共享.联机游戏)中提供很好的帮助. NSD是基于Apple的Bonjo

【Android应用开发技术:图像处理】Bitmap显示性能优化分析

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells Github:https://github.com/AllenWells [Android应用开发技术:图像处理]章节列表 Bitmap经常会消耗大量内存而导致程序崩溃,常见的异常如下所示:java.lang.OutofMemoryError:bitmap size extends VM budget,因此为了保证程序的稳定性,我们应该小心处理程序

【Android应用开发技术:用户界面】章节列表

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells Github:https://github.com/AllenWells [Android应用开发技术:用户界面]章节列表 [Android应用开发技术:用户界面]用户界面基本原理 [Android应用开发技术:用户界面]设备适配 [Android应用开发技术:用户界面]用户界面布局技巧 [Android应用开发技术:用户界面]View基本原理 [

【Android应用开发技术:用户界面】布局管理器

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells Github:https://github.com/AllenWells [Android应用开发技术:用户界面]章节列表 布局管理继承于ViewGroup.它用来管理Android应用用户界面里各组件,它的使用使得Android应用的图形用户界面具有良好的平台无关性. 常见的布局方式例如以下所看到的: 线性布局 表格布局 帧布局 相对布局 网络布

本人讲课时录制的Android应用开发技术教学视频

网盘地址:http://yun.baidu.com/pcloud/album/info?query_uk=1963923831&album_id=3523786484935252365 本人讲课时录制的视频,采用webex录制,视频文件内容相对较小30-50兆左右,1个视频文件平均大概有1个小时左右的时间,每个例子基本上从建立项目开始边做边讲. 由于讲课范围是Android应用开发技术,视频没涉及搭建环境,基础控件的使用等基础内容. 主要内容包括: 后台服务. 服务的绑定.服务和线程.远程服务和

【Android应用开发技术:用户界面】界面设计中易混淆的概念汇总

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells Github:https://github.com/AllenWells [Android应用开发技术:用户界面]章节列表 一 px.dp.sp px:即像素,每个px对应屏幕上的一个点. dp:即设备独立像素,一种基于屏幕密度的抽象单位,在每英寸160点的显示器上:1 dp = 1 px. sp:即比例像素,主要用来处理字体大小,可以根据用户字体

【Android应用开发技术:用户界面】9Patch图片设计

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells Github:https://github.com/AllenWells [Android应用开发技术:用户界面]章节列表 9Patch图片是一种特殊的PNG图片,该图片以.9.png为后缀名,它在原始图片四周各添加一个宽度为1像素的线条,这4条线决定了该图片的缩放规则和内容显示格则. 一 9Patch图片的显示规则 9Patch图片left边和t

【Android应用开发技术:应用组件】Fragment使用方法

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells Github:https://github.com/AllenWells 一 Fragment管理与事务 Activity通过FragmentManager管理Fragment,FragmentManager可以完成以下功能: 调用findFragmentById()或findFragmentByTag()方法来获取指定的Fragment.在XML

【Android应用开发技术:应用组件】Intent基本原理

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells Github:https://github.com/AllenWells 一个App通常都会有好几个Activity.每一个Activity的界面都扮演者用户接口的角色,允许用户执行一些特殊任务,例如查看地图或者是开始拍照等.如何让用户从一个Activity跳到另外一个Activity呢,这便是今天要介绍的Intent. Intent来定义App的