Fragment学习(一) :生命周期

一、 何为Fragment

Fragment是activity的界面中的一部分或一种行为。你可以把多个Fragment们组合到一个Activity中来创建一个多面界面,并且你可以在多个Activity中重用一个Fragment。你可以把Fragment认为模块化的一段Activity,它具有自己的生命周期,接收它自己的事件,并可以在Activity运行时被添加或删除。
Fragment不能独立存在,它必须嵌入到Activity中,而且Fragment的生命周期直接受所在的Activity的影响。例如:当Activity暂停时,它拥有的所有的Fragment们都暂停了,当Activity销毁时,它拥有的所有Fragment们都被销毁。

然而,当Activity运行时(在onResume()之后,onPause()之前),你可以单独地操作每个Fragment,比如添加或删除它们。当你在执行上述针对Fragment的事务时,你可以将事务添加到一个棧中,这个栈被activity管理,栈中的每一条都是一个Fragment的一次事务。有了这个栈,就可以反向执行Fragment的事务,这样就可以在Fragment级支持“返回”键(向后导航)。
当向activity中添加一个Fragment时,它须置于ViewGroup控件中,并且需定义Fragment自己的界面。你可以在layoutxml文件中声明Fragment,元素为:<fragment>;也可以在代码中创建Fragment,然后把它加入到ViewGroup控件中。然而,Fragment不一定非要放在Activity的界面中,它可以隐藏在后台为Activity工作。

说道这里,你可能还无法理解,那我们举个官网上的例子说明下:

写一个读新闻的程序,可以用一个Fragment显示标题列表,另一个Fragment显示选中标题的内容,这两个Fragment都在一个Activity上,并排显示。那么这两个Fragment都有自己的生命周期并响应自己感兴趣的事件。

于是,不需再像手机上那样用一个Activity显示标题列表,用另一个Activity显示新闻内容;现在可以把两者放在一个Activity上同时显示出来。

二、 Fragment的生命周期

接下来,我们通过一个实例来更好的理解Fragment。

定义一个Fragment,并覆盖其中的11个回调方法:

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的Activity(Fragment是activity的界面中的一部分,它必须依附于Activity存在)的定义如下:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class FragmentLifecycle extends Activity
{
    Button startActivity, addFragment, backFragment, replaceFragment, finish;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        startActivity = (Button) findViewById(R.id.startActivity);
        addFragment = (Button) findViewById(R.id.addFragment);
        backFragment = (Button) findViewById(R.id.backFragment);
        replaceFragment = (Button) findViewById(R.id.replaceFragment);
        finish = (Button) findViewById(R.id.finish);
        // 为startActivity按钮绑定事件监听器
        startActivity.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View source)
            {
                Intent intent = new Intent(FragmentLifecycle.this, SecondActivity.class);
                startActivity(intent);
            }
        });
        // 为addFragment按钮绑定事件监听器
        addFragment.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View source)
            {
                LifecycleFragment fragment = new LifecycleFragment();
                getFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();
            }
        });
        // 为backFragment按钮绑定事件监听器
        backFragment.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View source)
            {
                SecondFragment fragment = new SecondFragment();
                getFragmentManager().beginTransaction().replace(R.id.container, fragment).addToBackStack("aa")// 将替换前的Fragment添加到Back栈
                .commit();
            }
        });
        // 为replaceFragment按钮绑定事件监听器
        replaceFragment.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                SecondFragment fragment = new SecondFragment();
                getFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();
            }
        });
        // 为finish按钮绑定事件监听器
        finish.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View source)
            {
                // 结束该Activity
                FragmentLifecycle.this.finish();
            }
        });
    }
}

下面,我们测试Fragment的生命周期:

1. 点击“加载目标Fragment”,查看日志输出

可以看到,Fragment加载后,经过onResume方法后,变为运行可见的状态。

2. 单击“启动对话框风格的Activity”。

启动对话框风格的Activity时,原先的Activity进入onPause()状态,而它管理的Fragment同样进入OnPause状态。

3. 关闭对话框风格的Activity

可见,当对话框关闭后,Fragment又变为运行状态。

4. 单击“替换目标Fragment、并加入Back栈”

替换目标Fragment、并加入Back栈中,此时该Fragment虽然不可见,但它并未被销毁。当用户按下返回键,该Fragment将再次显示出来。

5. 单击退出按钮,结束Fragment

退出Activity后,Fragment同样被销毁。

时间: 2024-09-20 01:39:40

Fragment学习(一) :生命周期的相关文章

Android开发 - Fragment与Activity生命周期比较

1. Fragment的生命周期 见下图   2. 与Activity生命周期的对比 见下图   3. 代码场景演示实例 切换到该Fragment: AppListFragment(7649): onAttachAppListFragment(7649): onCreateAppListFragment(7649): onCreateViewAppListFragment(7649): onActivityCreatedAppListFragment(7649): onStartAppListF

Android中Fragment的生命周期与返回栈的管理_Android

既然我们已经知道了Fragment很好用,那么我们也需要知道它的工作原理.Fragment只能存在于(作为容器的)Activity中,每一个Fragment都有自己的视图结构,可以像我们之前那样载入布局.Fragment的生命周期更加复杂,因为它有更多的状态,如图: 我们来看一下Fragment完整的生命周期. 在Fragment生命周期开始,onInflate方法被调用.要注意的是,这个方法只在我们直接用标签在布局文件中定义的时候才会被调用.我们可以在这个方法中保存一些在xml布局文件中定义的

Android中Fragment的生命周期与返回栈的管理

既然我们已经知道了Fragment很好用,那么我们也需要知道它的工作原理.Fragment只能存在于(作为容器的)Activity中,每一个Fragment都有自己的视图结构,可以像我们之前那样载入布局.Fragment的生命周期更加复杂,因为它有更多的状态,如图: 我们来看一下Fragment完整的生命周期. 在Fragment生命周期开始,onInflate方法被调用.要注意的是,这个方法只在我们直接用标签在布局文件中定义的时候才会被调用.我们可以在这个方法中保存一些在xml布局文件中定义的

Android开发入门(三)碎片简介 3.2 Fragment的生命周期

就像activities一样,fragments也有它们自己的生命周期.理解fragments的生命周期,可以使你在它们 被销毁的时候保存它们的实例,这样在它们重新被创建的时候,就能恢复它们之前的状态.下面的例子测试 了fragments的不同状态. 1. 创建一个Fragment的子类:Fragment1.java. public class Fragment1 extends Fragment { @Override public View onCreateView(LayoutInflat

JavaWeb学习之Servlet(二)----Servlet的生命周期、继承结构、修改Servlet模板

一.http协议回顾: 在上一篇文章中:JavaWeb学习之Servlet(一)----MyEclipse及Tomcat的配置,我们通过在浏览器输入url,就能看到在MyEclipse中编写的Servlet资源,效果如下: 上图中,整个过程是这样的:浏览器中输入url后,会通过hosts文件/dns服务器解析为IP地址,进而找到对应ip地址的服务器. 在这期间,浏览器会通过http协议发出请求.服务器端收到请求后,做了下面这些事: (1)分析出当前请求的是哪台虚拟主机: 查看Host请求头分析出

关于fragment生命周期

问题描述 关于fragment生命周期 如题.关于生命周期.A fragment跳转到B fragment,然后back回Afragment的哪一个函数里? 解决方案 1.当一个fragment被创建的时候,它会经历以下状态.. onAttach() onCreate() onCreateView() onActivityCreated() ??? 2.当这个fragment对用户可见的时候,它会经历以下状态. onStart() onResume() ??? 3.当这个......答案就在这里

浅谈Android App开发中Fragment的创建与生命周期_Android

Fragment是activity的界面中的一部分或一种行为.你可以把多个Fragment们组合到一个activity中来创建一个多面界面并且你可以在多个activity中重用一个Fragment.你可以把Fragment认为模块化的一段activity,它具有自己的生命周期,接收它自己的事件,并可以在activity运行时被添加或删除. Fragment不能独立存在,它必须嵌入到activity中,而且Fragment的生命周期直接受所在的activity的影响.例如:当activity暂停时

实例讲解Android应用开发中Fragment生命周期的控制_Android

一.Fragment的生命周期初探 因为Fragment必须嵌入在Acitivity中使用,所以Fragment的生命周期和它所在的Activity是密切相关的. 如果Activity是暂停状态,其中所有的Fragment都是暂停状态:如果Activity是stopped状态,这个Activity中所有的Fragment都不能被启动:如果Activity被销毁,那么它其中的所有Fragment都会被销毁. 但是,当Activity在活动状态,可以独立控制Fragment的状态,比如加上或者移除F

Android Fragment的生命周期详解_Android

Fragments的生命周期        每一个fragments 都有自己的一套生命周期回调方法和处理自己的用户输入事件. 对应生命周期可参考下图: 详解Android Fragment之二:Fragment的创建和生命周期         创建片元(Creating a Fragment)        To create a fragment, you must create a subclass of Fragment (or an existing subclass of it).