Fragment:碎片、片段,碎片表示轻量级和灵活,是开发android平板电脑必须掌握的技术。其将界面UI进行分块,以块的方式组织UI,完全可以达到界面UI组件的复用。
我们可以将不同的Fragments组合起来放到一个activity中,或者在不同的activity中重用一个fragment。你可以将一个fragment看成是一个activity中的一个片段,它有自己的生命周期(如何从创建到销毁),接受它自己的输入事件,并且可以在activity运行时动态的添加或者移除一个fragment。
比如,当一个activity暂停的时候,它里面所有的fragments也同样暂停;当activity销毁的时候,它里面所有的fragment同样也被销毁;然而,当一个activity正在运行(它处于resumed生命周期的时候),我们可以独立的操纵每个fragment执行注入添加和移除它们;另外,当你执行一个fragment操作的时候,你可以将它添加到一个历史栈里面去,这个栈是由它的宿主activity维护,每一个栈里面的元素都是一个已经被执行过的fragment。这个堆栈可以让我们通过返回键来恢复之前的fragment。
当你将一个fragment作为activity的布局文件的一部分添加进去的时候,它就在activity的视图层次中的ViewGroup中。(1)可以通过在activity的layout中定义
注:Fragment是android3.0版本开始提供的技术,google为了能够兼容1.6以上的版本,提供了android-support-v4.jar包。可以通过SDK Manager下载AndroidSupport Package,在Extras目录下的Android Support。使用时你需要在项目代码顶层创建libs文件夹,并将该jar库文件拷贝到libs里面去。下面使用该jar来研究fragment。
2、 创建activity_main布局文件
3、创建MyFragment1
package com.example.myfragment;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class MyFragment1 extends Fragment{
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
Log.d(this.getTag(), "onAttach");
super.onAttach(activity);
}
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
Log.d(this.getTag(), "onCreate");
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
Log.d(this.getTag(), "onCreateView");
return inflater.inflate(R.layout.layout1, container,false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
Log.d(this.getTag(), "onActivityCreated");
super.onActivityCreated(savedInstanceState);
}
@Override
public void onStart() {
// TODO Auto-generated method stub
Log.d(this.getTag(), "onStart");
super.onStart();
}
@Override
public void onResume() {
// TODO Auto-generated method stub
Log.d(this.getTag(), "onResume");
super.onResume();
}
@Override
public void onPause() {
// TODO Auto-generated method stub
Log.d(this.getTag(), "onPause");
super.onPause();
}
@Override
public void onStop() {
// TODO Auto-generated method stub
Log.d(this.getTag(), "onStop");
super.onStop();
}
@Override
public void onDestroyView() {
// TODO Auto-generated method stub
Log.d(this.getTag(), "onDestroyView");
super.onDestroyView();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
Log.d(this.getTag(), "onDestroy");
super.onDestroy();
}
@Override
public void onDetach() {
// TODO Auto-generated method stub
Log.d(this.getTag(), "onDetach");
super.onDetach();
}
}
4、创建
MainActivity
文件
package com.example.myfragment;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
public class MainActivity extends FragmentActivity {
//这里是继承FrameActivity,而不是Activity
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
执行,然后再按home’键,再进入程序,再按back键,效果如下:
注:
1、引用了android.support.v4.app.*;包中的组件;
2、为了兼容android1.6,MainActivity继承于FrameActivity;
3、改代码中fragment已写入xml中,缺点是不能实现动态的增删,后面的学习将使用代码来进行添加删除fragment。
4、onCreateView方法中,inflater.inflate(R.layout.layout1,container,false);第一个参数把某一布局文件转换成view对象;
第二参数是把这个view对象放入container容器中;这个container容器其实就是activity_main的根节点,可以通过在根节点下设置tag属性,并通过container.getTag()获取值,再将其打印出来。
第三个参数代表是否把这个view对象添加到container容器内部,在xml中我们已经将它添加到容器内部。经测试,如果此时你再将之设置为true,其依然能够正确执行。
(1)、onAttach()//当一个Fragment对象关联到一个Activity时调用。
(2)、onCreate()//初始创建Fragment对象时调用。
(3)、onCreateView()//创建与Fragment对象关联的View视图时调用。
(4)、onActivityCreated()//当Activity对象完成自己的onCreate方法时调用。
(5)、onStart()//Fragment对象在ui可见时调用。
(6)、onResume()//Fragment对象的ui可以与用户交互时调用。
(7)、onPause()//Fragment对象可见,但不可交互。有Activity对象转为onPause状态时调用。
(8)、onStop()//有空间完全遮挡;或者宿主Activity对象转为onStop状态时调用。
(9)、onDestroyView()//Fragment对象清理view资源时调用,也就是移除fragment中的视图。
(10)、onDestroy()//Fragment对象完成对象清理View资源时调用。
(11)、onDetach()//Fragment对象没有与Activity对象关联时调用。
当一个fragment被创建的时候执行1-4;
当这个fragment创建完毕,到对用户可见的时候,执行5-6;
当这个fragment从可见到不可见时,执行7-8;
当这个fragment被销毁了(或者持有它的activity被销毁了),执行9-11;
另外在3-5,可以使用Bundle对象保存一个fragment的对象。