导航

Fragment基本用法——实现AndroidManual学习手册

Posted on 2017-06-16 01:42  Young哥哥  阅读(134)  评论(0编辑  收藏  举报

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 不能传值