zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Fragment学习(一) :生命周期

学习 生命周期 fragment
2023-09-14 08:56:50 时间

一、 何为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同样被销毁。


剖析Fragment的Pause生命周期全过程 之前遇到一个问题,与Fragment的Pause生命周期有关,所以就研究了一下Fragment的Pause生命周期特点。就有关这篇笔记。 我们知道Fragment的生命周期是依赖Activity的,所以想探究Fragment的Pause过程需要从Activity的Pause下手。
Activity的生命周期-典型情况下的生命周期 Activity的生命周期分为两部分内容,一部分是典型情况下的生命周期,另一部分是异常情况下的生命周期。所谓典型情况下的生命周期,是指在有用户参与的情况下,Activity所经过的生命周期的改变;而异常情况下的生命周期是指Activity被系统回收或者由于当前设备的Configuration发生改变从而导致Activity被销毁重建,异常情况下的生命周期的关注点和典型情况下略有不同。
      小菜中午和朋友闲聊,被问到 Activity 与 Fragment 的生命周期,以为是很基础的东西,基本可以把生命周期说全,但是被问到 Activity 与 Fragment 交互的生命周期运行顺序,切换 Fragment 时候的生命周期顺序,以及切换完之后退出时的生命周期...瞬间感觉基础知识太不扎实了。