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同样被销毁。
Fragment学习(一) :生命周期的更多相关文章
- react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)
react学习小结 本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...
- Android Fragment详解(二):Fragment创建及其生命周期
Fragments的生命周期 每一个fragments 都有自己的一套生命周期回调方法和处理自己的用户输入事件. 对应生命周期可参考下图: 创建片元(Creating a Fragment) To c ...
- Android开发 - Fragment与Activity生命周期比较
1. Fragment的生命周期 见下图 2. 与Activity生命周期的对比 见下图 3. 代码场景演示实例 切换到该Fragment: AppListFragment(7649): onAtta ...
- vue学习之五生命周期
一.vue生命周期图解 下图展示了实例的生命周期.你不需要立马弄明白所有的东西,不过随着你的不断学习和使用,它的参考价值会越来越高. 二.vue钩子函数使用 2.1beforeCreate 在实例初始 ...
- Activity ViewPager Fragment框架的生命周期
1.Fragment的生命周期函数 onAttach.onCreate.onCreateView.onViewCreated.onActivityCreated.onStart.onResume.on ...
- *Fragment与Activity生命周期的协调
本文出处:http://blog.csdn.net/think_soft/article/details/7272869 拥有Fragment的Activity的生命周期直接影响了其中的Fragmen ...
- 学习vue生命周期
首先,每个Vue实例在被创建之前都要经过一系列的初始化过程,这个过程就是vue的生命周期.首先看一张图吧~这是官方文档上的图片相信大家一定都会很熟悉: 可以看到在vue一整个的生命周期中会有很多钩子函 ...
- fragment hide/show 生命周期
Fragment的使用越来越普遍了,掌握它的生命周期以及注意事项时非常有必要的,首先 All subclasses of Fragment must include a public empty co ...
- PHP内核的学习--PHP生命周期
一切的开始: SAPI接口 SAPI(Server Application Programming Interface)指的是PHP具体应用的编程接口, 就像PC一样,无论安装哪些操作系统,只要满足了 ...
- servlet入门学习之生命周期
一. 什么是Servlet Servlet是用Java语言编写的服务器端小程序,驻留在web服务器中,并在其中运行,扩展了web服务器的动态处理功能. 用java语言编写的java类 在web容器中运 ...
随机推荐
- _STORAGE_WRITE_ERROR_:./Application/Runtime/Cache/Home/f8995a0e1afcdadc637612fae5a3b585.php
将one think部署到服务器上出现下面的问题 _STORAGE_WRITE_ERROR_:./Application/Runtime/Cache/Home/f8995a0e1afcdadc6376 ...
- Devexpress 中控件及GridView控件的Cell增加右键复制功能
a) GridView中任何一个Cell增加右键复制功能GridHitInfo gridHitInfo = new GridHitInfo(); //用户接收GridView中单元格数据void gr ...
- 洛谷 P1567 统计天数【最长上升子序列/断则归一】
题目背景 统计天数 题目描述 炎热的夏日,KC非常的不爽.他宁可忍受北极的寒冷,也不愿忍受厦门的夏天.最近,他开始研究天气的变化.他希望用研究的结果预测未来的天气. 经历千辛万苦,他收集了连续N(1& ...
- 用Direct2D和DWM来做简单的动画效果2
原文:用Direct2D和DWM来做简单的动画效果2 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/sunnyloves/article/detai ...
- jQuuery Mobile 移动端开发框架
jQuery Mobile 是创建移动 web 应用程序的框架. jQuery Mobile 适用于所有流行的智能手机和平板电脑. jQuery Mobile 使用 HTML5 和 CSS3 通过尽可 ...
- day38 21-今天的内容总结
以前我们在web层里面去调Service再在Service里面去调DAO是一路new过去的,在web层里面new Service,然后在Service里面new DAO.每次你都需要主动去找这个对象. ...
- PLAY2.6-SCALA(十二) 表单的处理
一.表单处理流程如下 1.定义一个表单,在这里表单最多有22个字段 import play.api.data._ import play.api.data.Forms._ //要使用验证和约束 imp ...
- oracle终止数据库Abort
中止数据库实例, 立即关闭 异常关闭是最主动的关闭类型,并且有如下这些特征: 从shutdown abort命令发布起,禁止建立任何新的oracle连接 当前正在运行的sql语句被终止,无论他们处于什 ...
- PHP实现git部署的方法教程
https://mp.weixin.qq.com/s/WH_JXah47BhQyviuuPAunw 背景 在小站点上,直接用git来部署php代码相当方便,你的远程站点以及本地版本库都有一个版本控制, ...
- hdu5442 Favorite Donut 后缀数组 长春网赛
wa从一点到晚上11点没停过,也不知道为什么错,第二天换了个思路做,终于过了.这题还是有点问题的,数据有点水,我看到有人贴的代码baabbaab这组数据是4 0,明显错的,但是却可以过. 下面的是我第 ...