【转】 Pro Android学习笔记(三八):Fragment(3):基础小例子-续
Step 2:实现Fragment指定调用类TitleFragment
系统执行setContentView(R.layout.fragment_basic)调用时,左边fragment指定了实现类,则调用该类TitleFragment。我们结合生命周期来进行学习。Fragment的生命周期看起来比Activity要复杂,因为它要处理与activity之间的关系。

onInflate()和onAttach()
Fragment可有一个view hierarchy,以之与用户互动。这个view层级可以根据XML布局文件被创建(inflated)或通过代码创建。view层级需要与activity关联,才能被用户看见。Fragment的最初的两个生命周期为onInflate和onAttach。
/* 左边fragment是list,和ListActivity一样,继承ListFragment */
public class TitleFragment extends ListFragment{
private FragmentBasicTest myActivity = null;
private int mCurCheckPosition = 0;
…... 略 ……
@Override //【2】在fragment与activity关联后调用onAttach()。由于右边fragment的具体实现在activity的showDetails()中实现,需要获取activity的对象。 当然也可以直接用getActivity()获取。
public void onAttach(Activity activity) {
showInfo("onAttach() is called. activity is " + activity);
showInfo(" getActivity() : " + getActivity());
super.onAttach(activity);
myActivity = (FragmentBasicTest)activity;
}
@Override//【1】首先调用:在Activity调用setContentView()时,xml中有<fragment>时被调用。bundle存贮的是fragment的状态,并非初始化的值。一般而言,此时太早,还没有和activity关联,一般很少需要在此进行处理,除非我们需要处理fragment的属性或参数。在API的reference中,Fragment的主要lifecycle甚至没有将onInflate()列入,因此在实际编程中,会较少用到。
public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) {
showInfo("onInfalte() is called");
showInfo(" activity : " + activity);
showInfo(" getActivity() : " + getActivity()); //Fragment尚为关联activity
showInfo(" attribute是fragment的属相,例如R.id.titles = " + R.id.titles);
for(int i = 0 ; i< attrs.getAttributeCount() ; i ++){
showInfo(" attribute " + i + " :" + attrs.getAttributeName(i) + " = " + attrs.getAttributeValue(i));
}
showInfo(" bundle : " + savedInstanceState);
super.onInflate(activity, attrs, savedInstanceState);
}
private void showInfo(String s){
Log.d("TitleFragment",s);
}
}
我们看看运行的logcat显示。我们可以看出,在activity调用setContentView时,先调用Flagment中的onflate(),然后调用onAttach()。在onInfalte()中可以读取到我们在xml文件中<fragment… >设置的属性。在后面实现右边的fragment中,由于布局文件中<fragment …>中并没有指定class属性,而是在代码中实现,故没有onInflate()状态。
与activity的关联:看到onInfalte()和onAttach()都可以获得activity对象,但是如果采用getActivity()来获取,则发现onInfalte()的阶段对处理UI太早,都不能关联到activity。
参数:在整个生命周期,可以通过getArguments()来获取参数,但是不能在与activity关联后进行setArgments(),只能在初始化极早的阶段,例如构造函数和onInflate()。

onCreate()和onCreateView()
@Override //【3】在创建fragment中进行初始化时调用。注意此处的bundle参数,是存储fragment的状态。如果我们要为fragment启动一个后台线程,可以考虑将代码放于此处。
public void onCreate(Bundle savedInstanceState) {
showInfo("onCreate() is called. ");
super.onCreate(savedInstanceState);
}
@Override //【4】创建fragment,并返回fragment的view层次结构,用于对UI的设计。本例继承了ListFragment实现,由其生成ListView,它的资源ID是android.R.id.list1,或者可以通过getListView()来获取。我们在此不需要在进行特别的处理,仅用于跟踪生命周期。
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
showInfo("onCreateView() is called. ");
return super.onCreateView(inflater, container, savedInstanceState);
}
onCreate()和onCreateView()都是在activity调用setContentView()时被调用。也就是activity上未完成onCreate(),因此不应该在此加入与activity的view相关的代码。而后面的生命周期这是在activity完成onCreate()之后调用的。

onActivityCreated()
onActivityCreated顾名思义,是在activity完成onCreate()后被调用。我们可以在此处理activity的其他UI操作,而其他的fragment已经与activity关联,我们可以进行相互间处理。这也是用户看到UI界面之前的最后一个状态,对于从saved状态中重新创建activity及fragment来讲是重要状态。
回想一下,在ListActivity中是在setContentView()后面进行Adapter的设置,因为setContentView已经提供了view层级,因此在fragment中具体设置list也放在fragment的onCreateView()之后的生命周期onActivityCreated()中执行。
@Override //【5】onActivityCreated()在activity完成onCreate()后执行,在此可以加入UI设计(onCreateView())之后,UI被用户看到之前的代码。
public void onActivityCreated(Bundle savedInstanceState) {
showInfo("onActivityCreated() is called.");
super.onActivityCreated(savedInstanceState);
// 1)通过Adapter进行view和data的关联
setListAdapter(new ArrayAdapter<String>(getActivity(), //注意:在ListFragment中不要直接和ListView(通过id或者getListView()获取)关联,而要用setListAdapter()
android.R.layout.simple_list_item_1,
BooksInfo.TITLES));
ListView lv = getListView();
lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
lv.setSelection(mCurCheckPosition);
//2)根据书名设置右边framgent UI。
myActivity.showDetails(mCurCheckPosition);
}
onStart()、onResume()、onPause()和onStop()
这几个状态和activty的相应状体相似,对应为可视,可互动,不可互动和不可视。和activity的生命周期图相对比,从不可视的后台回复到可视的前台的过程是onStop()—>onRestart()—>onStart()。而fragment为onStop()—>onStart()。

onDestroyView()、onDestroy和onDetach()
当fragment允许与view相关的资源释放时调用onDestroyView(),清空通过onCreateView()所返回的view。接着,onDestroy()进行最后fragment状态的清空。最后调用onDetach(),删除与activity的关联()。

与用户互动处理
@Override //当用户点击书名,在右边fragment中显示相关的内容。在ListFragment中可以直接通过回调函数onListItemClick来实现。
public void onListItemClick(ListView l, View v, int position, long id) {
mCurCheckPosition = position;
myActivity.showDetails(mCurCheckPosition);
}
本博文涉及的例子代码,可以在Pro Android学习:Fragment中下载。
相关链接: 我的Android开发相关文章
【转】 Pro Android学习笔记(三八):Fragment(3):基础小例子-续的更多相关文章
- 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果
目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...
- 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版
目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...
- 【转】 Pro Android学习笔记(三九):Fragment(4):基础小例子-续
目录(?)[-] Step 3实现简介显示类DetailFragment 创建实例 编写所需的生命周期代码 Step 4实现showDetailint index如何管理fragment fragme ...
- 【转】 Pro Android学习笔记(五六):配置变化
目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...
- Pro Android学习笔记 ActionBar(1):Home图标区
Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...
- 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...
- 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET
目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...
- 【转】 Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode
目录(?)[-] adb命令 模拟器Console StrictMode adb命令 我们在学习SQLite的使用,介绍过部分adb命令的使用,见Pro Android学习笔记(五):了解Conten ...
- 【转】 Pro Android学习笔记(五二):ActionBar(5):list模式
可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和 ...
- 【转】 Pro Android学习笔记(三五):Menu(6):XML方式 & PopUp菜单
目录(?)[-] 利用XML创建菜单 XML的有关属性 onClick事件 Pop-up菜单 利用XML创建菜单 在代码中对每个菜单项进行设置,繁琐且修改不灵活,不能适配多国语言的要求,可以利用资源进 ...
随机推荐
- Python菜鸟之路:Python基础(二)
一.温故而知新 1. 变量命名方式 旧的方式: username = 'xxxx' password = 'oooo' 新的方式: username, password = 'xxxx', 'oooo ...
- MySQL删除相同前缀的表,修改某个库的存储引擎
MySQL5.0 之后,提供了一个新的数据库information_schema,用来记录MySQL总的元数据信息.元数据指的是 数据的数据. 比如表名.列名.列类型.索引名等表的各种属性名称.这个库 ...
- memcached 不同客户端的问题
摘要: memcached-java客户端调用get方法获取数据失败 主要演示一下在memcached服务器端set数据之后,在客户端调用java api获取数据.不过此过程如果不慎会读取数据失败. ...
- WebApp页面开发小结
一 背景 公司需要开发一个web页面,需要支持主流android和ios手机,采用web页面好处是一个页面,在不同平台之间都可以用,节省成本,基本html.js和css大家也都熟悉.但是对 ...
- 使用documentFragment
function insertHtml(range, val) { var doc = range.doc, frag = doc.createDocumentFragment(); K('@' + ...
- ICP 求解相机思路
1.之前仍然是需要创建find_feature_matches,和pixel2cam,一个是用来匹配描述子的,一个是把像素坐标转成归一化平面坐标的.里面的变量都要带上&.2.因为是3d-3d. ...
- 算法(Algorithms)第4版 练习 2.2.9
package com.qiusongde; import edu.princeton.cs.algs4.In; import edu.princeton.cs.algs4.StdOut; publi ...
- The Quantum L3 router and floating IPs
This post shows how the Quantum L3 Agent uses the Linux IP stack to implement the Quantum L3 Routing ...
- neutron qos Quality of Service
Quality of Service advanced service is designed as a service plugin. The service is decoupled from t ...
- BZOJ 3433 [Usaco2014 Jan]Recording the Moolympics:贪心
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3433 题意: 给出n个区间[a,b). 有两个记录器,每个记录器中存放的区间不能重叠. 求 ...