【转】 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创建菜单 在代码中对每个菜单项进行设置,繁琐且修改不灵活,不能适配多国语言的要求,可以利用资源进 ...
随机推荐
- This instability is a fundamental problem for gradient-based learning in deep neural networks. vanishing exploding gradient problem
The unstable gradient problem: The fundamental problem here isn't so much the vanishing gradient pro ...
- js函数的caller属性
funcName.caller : 返回一个对函数的引用, 该函数调用了当前函数 function test() { if (test.caller) { var a = test.caller.to ...
- Django 认证系统 cookie & session & auth模块
概念 cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie的工作原理是:由服务器产生内容,浏 ...
- 我的Android进阶之旅------>关于android:layout_weight属性的一个面试题
最近碰到一个面试题,按照下图,由Button和EditText组成的界面下厨布局代码,解决这题目需要使用android:layout_weight的知识. 首先分析上图所示的界面可以看成一下3个部分. ...
- centos install docker setup centos7 安装docker
centos7 安装docker 1: 安装必要的一些系统工具sudo yum install -y yum-utils device-mapper-persistent-data lvm2 2: 添 ...
- Spring注解式与配置文件式
http://tom-seed.iteye.com/blog/1584632 Spring注解方式bean容器管理 1.通过在配置文件中配置spring组件注入 <context:compone ...
- 快照COW
What is Copy-on-write? Copy-on-write Copy-on-write (sometimes referred to as "COW") i ...
- Redis缓存全自动安装shell脚本
我只是把命令放到shell文件中了,方便安装,代码如下: #!/bin/bash # shell的执行选项: # -n 只读取shell脚本,但不实际执行 # -x 进入跟踪方式,显示所执行的每一条命 ...
- 20145229吴姗珊 《Java程序设计》第4周学习总结
20145229吴姗珊 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 继承与多态 6.1继承共同行为 1.继承基本上就是避免多个类间重复定义共同行为 简单的类的定义 使用s ...
- 20165101刘天野 2017-2018-2 《Java程序设计》第2周学习总结
# 20165101刘天野 2017-2018-2 <Java程序设计>第2周学习总结 教材学习内容总结 基本数据类型 逻辑类型:boolean 整型:byte.short.int.lon ...