码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-07-29 17:24:32      阅读:425      评论:0      收藏:0      [点我收藏+]

标签:

作者:郭孝星
微博:郭孝星的新浪微博
邮箱:allenwells@163.com
博客: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会再次显示出来,如下图所示:

技术分享

点击退出

技术分享

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

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

标签:

原文地址:http://blog.csdn.net/allenwells/article/details/47129085

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!