Fragment基本用法——实现AndroidManual学习手册
一、Fragment的概念和用法:
(一)、概念:
Fragment是在Android 3.0 (API level 11)开始引入新的API技术。为了提高代码重用性和改善用户体验,我们将Activity中的UI组件进行分组和模块化管理。这些分组后的UI组件就是Fragment。一个Activity页面中可以包含多个Fragment模块,而同一个Fragment模块也可以被多个Activity使用。每个Fragment有自己的布局,有自己的生命周期。虽然Fragment拥有自己的生命周期,但因为Fragment必须被嵌入到Activity中使用,因此Fragment的生命周期是受其Activity宿主的生命周期所控制的。当Activity暂停时,该Activtiy内的所有Fragment都会暂停;当Activity被销毁时,该Activity内的所有Fragment都会被销毁。
(二)、Fragment要点:【重点】
1、Fragment作为Activity界面的一部分组成出现;
2、可以在一个Activity中同时出现多个Fragment,并且,一个Fragment亦可在多个Activity中使用;
3、在Activity运行过程中,可以添加、移除或者替换Fragment(add()、remove()、replace());
4、Fragment可以响应自己的输入事件,并且有自己的生命周期,当然,它们的生命周期直接受其所属的宿主Activity的生命周期控制。
如上图所示,“平板电脑”中,在一个Activity布局中放了两个Fragment:左侧是文章标题列表Fragment,右侧是文章内容展示的Fragment。左侧的标题列表不变,点击每条列表项,右侧的文章内容发生变化。点击和浏览内容都在同一个页面中发生,避免了页面切换和点击“返回键”返回的操作。用户感觉自然方便和快捷。
那么Fragment组件适用于普通屏幕的手机吗?答案是肯定的。Fragment本身是可复用的组件。是否在一个Activity页面中放置多个Fragment取决了屏幕的大小,如果屏幕大小不够,那么就可以在Activity A中只包含Fragment A,在Activity B中只包含Fragment B,点击A中的item跳转到B就可以。
1. Fragment 简介 V3.0版本之前 使用V4.jar
Android上的界面展示都是通过Activity实现的.但是,同样的界面在手机上显示可能很好看,在平板上就未必了,因为平板的屏幕非常大,手机的界面放在平板上可能会有过分被拉长、控件间距过大等情况。
为了让界面可以在平板上更好地展示,Android在3.0版本引入了Fragment(碎片)功能,它非常类似于Activity,可以像Activity一样包含布局。Fragment通常是嵌套在Activity中使用的,可以认为是"小Activity",每个"小Activity"拥有自己的布局以及相应的逻辑操作(点击事件等....)。 目前,有很多开发人员使用Fragment来替换Activity的部分功能 |
2. Fragment 的简单使用 注意使用的包
1. 创建Fragment的子类,重写onCreateView,设置fragment显示的内容 public class MyFragment1 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment1,container,false); //初始化UI组件 // view.findViewbyId(int id) // view.setonClickListener(l) return view; } }
2. 将fargment 添加进 main.xml 布局 <fragment android:id="@+id/frame1" //id tag 这两个属性,必须有一个 android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" name="com.example.fragmenttest.MyFragment1" /> //class name Fragment类 3. MainActivity 继承自 FragmentActivity 如果想要支持 3.0之前的版本,需要用 support.v4.app.Fragment,并且Activity 也必须为 FragmentActivity (Activity不支持) 如果不用支持 3.0之前的版本,可以使用 android.app.Fragment,Activity 为默认的Activity 4. 在Activity中,通过findViewById(int id)可以找到 Fragment中的组件(Fragment在当前Activity中)
使用代码的方式创建显示Fragment
FragmentManager manager = getFragmentManager(); 3.0 之前的版本,使用 getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); Fragment f2 = new Fragment2(); transaction.add(R.id.container, f2); //container 必须为ViewGroup组件(Layout) transaction.commit();
View view = inflater.inflate(R.layout.fragment2, container, false); 1. resource 视图资源ID R.layout.fragment2 2. root 根视图 如果attachToRoot true, resource解析的布局对象会放入 root中 如果attachToRoot false, root 只是提供了一些简单的布局属性的对象,会把这些属性设置到resource对象上 3. attachToRoot 是否将解析的布局文件放入 root 中
|
3. Fragment 生命周期
1、onAttach(Activity activity): Fragment与Activity关联后,调用 activity 被嵌入的Activity对象
2、onCreate(Bundle savedInstanceState): 当创建Fragment时被调用。与Activity的Oncreate类似。 savedInstanceSate 在Fragment.onSaveInstanceSate 中保存的数据
3、onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState)
每次创建、绘制该Fragment的View组件时回调该方法,Fragment将会显示该方法返回的View 组件;
inflater 布局加载器 container <fragment> 标签的父标签 对象 savedInstanceState 在Fragment.onSaveInstanceSate 中保存的数据
onViewCreated(View view, Bundle savedInstanceState) view onCreateView 返回的View 同长完成Fragment创建的最后工作
4、onActivityCreated(): 当Fragment的宿主Activity的onCreate()方法执行完成后调用;标示Activity已初始化完成
5、onStart(): 当Fragment的宿主Activity的onStart()方法执行完成后调用;可以将Activity.onStart()的操作放进来
6、onResume(): 宿主Activity的onResume()方法执行完成后调用;可以与用户进行交互
7、onPause(): 暂停Fragment时被回调;可以完成一些临时的暂停操作
8、onStop(): 停止Fragment时被回调;
9、onDestroyView(): onCreateView()创建的View与Fragment分离。销毁该Fragment所包含的View组件时调用;
10、onDestroy(): 销毁Fragment时被回调。仍然与Activity关联;
11、onDetach(): 将Fragment从Activity中删除、替换完成时调用该方法。 Fragment的资源会被释放
//读取XML中的Fragment属性 onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) 1. activity 被嵌入的Activity对象 2. attrs fragment 的一些XML属性值 3.savedInstanceSate 在Fragment.onSaveInstanceSate 中保存的数据
Fragment 在创建的时候,首先调用调用Activity相应的生命周期方法,在调用Fragment相对应的方法 Fragment 在销毁的时候,首先调用调用Fragment相应的生命周期方法,在调用Activity相对应的方法 onDestroey ArraryList<String> data=new ArrayList<String>(); data=null; |
4. Fragment 与Activity的交互
Activity 传值到 Fragment Bundle args = new Bundle(); args.putString("A", "A"); fragment.setArguments(args); 只能在onAttach()之前执行,所以使用 XML 不能传值 |