Fragment碎片用法

来源:互联网 发布:unity3d 联机unet 编辑:程序博客网 时间:2024/06/13 19:39

〇、概述:

Android是在Android 3.0 (API level 11)开始引入Fragment的。
【如果兼容3.0之前的版本,需要导入v4包】

1、可以把Fragment想成Activity中的模块,这个模块有自己的布局,有自己的生命周期,单独处理自己的输入,在Activity运行的时候可以加载或者移除Fragment模块。

2、可以把Fragment设计成可以在多个Activity中复用的模块。

3、当开发的应用程序同时适用于平板电脑和手机时,可以利用Fragment实现灵活的布局,改善用户体验。

一、概念及其特点(面试常考)

1.什么是Fragment:

1)更好的利用屏幕,实现手机与PAD同时适应,
2)实现布局文件和java代码的重复使用
3)一个屏幕中放多个Fragment
多个Fragment可以放在一个Activity中,
一个Fragment也可以放在多个Activity中

2.Fragment的特点与优点:

特点: 是一个有生命周期的UI控件,(独立的生命周期)
它的生命周期由宿主Activity来决定
Fragment的创建必须依赖Activity

优点: 使用PAD屏幕,充分利用屏幕资源
实现布局文件和java代码的重用

【注!!通过在XML文件中添加<fragment> 使得调用这个XML布局的页面都显示fragment中定义的内容。一个XML文件中可以定义多个fragment】

3.静态显示Fragment:

(1)显示Fragment,在当前页面的布局文件中添加
<fragment ></fragment>标签

<fragmentandroid:id="@+id/fragment"          android:name="com.niu.fragment.FragMentHello"           android:layout_width="match_parent"         android:layout_height="wrap_content"            android:layout_alignParentBottom="true" />

使用fragment注意事项:必须指明一个id或者tag属性,通过id
或者tag可以找到此fragment。name属性指向我们自己的fragment类;
名称规则:fragment所在的包名+类名,通过name直接找到Fragment(必须指定)
(2)写一个类继承Fragment;(fragment不用在清单文件中注册)
(3)重写onCreateView()方法,决定Fragment的布局(需要
创建布局的XML文件),为Fragment创建UI控件并返回view(如果不
显示,返回为null)(类似Activity中的initViews())

/*** @param inflater:布局填充器* @param container:包含这个Fragment的父布局* @param savedInstanceState:一个Bundle用来做现场保护*/public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {//(4):两种方式创建UI控件return  view;//Fragment视图;//return inflater.inflate(R.layout.product, null);            }

(4)在重写的onCreateView方法中创建UI控件并返回
创建UI控件的两种方式:
1)方式一:getActivity()返回创建此Fragment的Activity

TextView text = new TextView(getActivity);            text.setText("hello");            text.setTextSize(30);            return text;

2)方式二:通过布局填充器返回视图
步骤:
a:在layout下创建一个XML文件,写布局
b:通过布局填充器将布局添加

    //第一个参数:要填充的布局;    //第二个参数:nullView view = inflater.inflate(R.layout.button, null);    //设置相应操作return view;

(5)在宿主Activity中通过setContentView(R.layout.fragment_layout);静态加载布局此时的Activity中,可以直接通过id访问fragment的视图的控件,之后进行操作

4.动态显示:

FragmentManager碎片管理器:通过它对Fragment进行一系
列操作,比如查找,隐藏,添加FragmentManager是Google提供的碎片管理器,只有它能对Fragment进行事务操作。

创建碎片管理器:FragmentManager fm = getFragmentManager();
属性:fm.findFragmentById(Fragment的布局Id);//查找Fragment

在Activity中你可以通过getFragmentManager()来获得Fragment对象,然后通过FragmentManager对象的beginFragmentTransaction()方法来获得FragmentTransaction对象。通过它的add()方法来添加一个Fragment到当前的Activity中。

FragmentTransaction:事务
步骤:

(1)在XML文件中给Fragment创建一个占位,<FrameLayout></FrameLayout>并指定其id/tag,高度,宽度

 <FrameLayout            android:id="@+id/contentId"            android:layout_width="match_parent"            android:layout_height="match_parent" ></FrameLayout>

(2)在java代码中通过getFragmentManager().beginTransaction()创建一个事务;返回值类型为FragmenTransaction

FragmentTransaction ft = getFragmentManager.beginTransaction();

(3)在FragmentTransation的begin和commit之间进行一系列的操作,一个事务只能commit一次

添加:ft.add(Fragment占位的id,Fragment的实例对象new类);
替换:ft.replace();
移除:ft.remove();
显示:ft.show();
提交:ft.commit();
特别注意:①一个事务只能commit一次②每次执行一个操作都需要开启一个事务(不能设成全局变量)

将Fragment压入到回退栈,即使生命周期重新开始,回滚后也能回到以前的值ft.addToBackStack(null);//默认空栈,必须传null

5.Fragment传值:

(1)Bundle方式:

        Fragment.setArguments(Bundle)   放值        Fragment.getArguments(Bundle)   取值

Activity中设置数据:

a:通过碎片管理器开启一个事务

FragmentTransaction ft = getFragmentManager().beginTransaction();

b:实例化Fragment类,创建对象;

ContentFragment cf = new ContentFragment();// 这时并没有调用生命周期方法

c:实例化Bundle,并通过put…传值

Bundle bundle = new Bundle();
bundle.putString(key,”要传的数据”+new date());

d:使用setArguments()给Fragmenu对象设置值

cf.setArgument(bundle);

e:向Frangment中添加占位与数据

ft.add(R.id.contentId,cf);

f:最后提交

ft.commit();//commit提交后Fragment类的生命周期才开始

g:Fragment类中得到数据:

获得Bundle的值,getArguments();
Bundle bundle = getArguments();
String data = bundle.getString(key);
对数据进行操作

(2)Actvity公共方法的方式:

a:在Activity中设置初始化数据,并声明一个公共的方法,设置get,返回相应数据,供外界访问

例如:getList();

b:在Fragment中通过getActivity()方法获取

创建Fragment的归属Activity对象,将这个对象进行强制类型转换。((MainActivity)getActivity).getList()—>获得数据源list进行操作

6.Fragment的生命周期:11个

因为Fragment必须嵌入在Acitivity中使用,所以Fragment的生命周期和它的寄主Activity密切相关。

  如果Activity是暂停状态,其中所有的Fragment都是暂停状态;如果Activity是stopped状态,这个Activity中所有的Fragment都不能被启动;如果Activity被销毁,那么它其中的所有Fragment都会被销毁(皮之不存,毛将焉附)。

  但是,当Activity在活动状态,可以独立控制Fragment的状态,比如加上或者移除Fragment。
  

下图是Activity、Fragment两者生命周期的比照图:

  
这里写图片描述
初始化阶段—->Activity onCreate
onAttach(附着) 与归属Activity建立连接
onCreate 初始化Fragment
onCreateView 创建Fragment的UI控件
onactivityCreated 归属Activity的onCreate方法执行完之后被的调用
显示/隐藏
onStart
onResume
onPause
onStop
销毁阶段—–>Activity的onDestory
onDestoryView销毁Fragment的UI控件
onDestory 销毁Fragment
onDetach从屏幕上撕下来

当这样进行fragmenttransaction(事务)的时候,可以把fragment放入Activity的back stack中,这样用户就可以进行返回操作。
这里写图片描述

Log日志:(Ctrl+Shift+c xml文件中注释的快捷键)
从MainActivity动态添加Fragment到按返回建的log日志
E/MainActivity(21160): onCreate
E/MainActivity(21160): onStart
E/MainActivity(21160): onResume
E/ContentFragment(21160): onAttach
E/ContentFragment(21160): onCreate
E/ContentFragment(21160): onCreateView
E/ContentFragment(21160): onActivityCreated
E/ContentFragment(21160): onStart
E/ContentFragment(21160): onResume
E/ContentFragment(21160): onPause
E/MainActivity(21160): onPause
E/ContentFragment(21160): onStop
E/MainActivity(21160): onStop
E/ContentFragment(21160): onDestroyView
E/ContentFragment(21160): onDestroy
E/ContentFragment(21160): onDetach
E/MainActivity(21160): onDestroy

从MainActivity静态添加Fragment的log日志
E/MainActivity(22457): onCreate
E/ContentFragment(22457): onAttach
E/ContentFragment(22457): onCreate
E/ContentFragment(22457): onCreateView
E/ContentFragment(22457): onActivityCreated
E/MainActivity(22457): onStart
E/ContentFragment(22457): onStart
E/MainActivity(22457): onResume
E/ContentFragment(22457): onResume
E/ContentFragment(22457): onPause
E/MainActivity(22457): onPause
E/ContentFragment(22457): onStop
E/MainActivity(22457): onStop
E/ContentFragment(22457): onDestroyView
E/ContentFragment(22457): onDestroy
E/ContentFragment(22457): onDetach
E/MainActivity(22457): onDestroy

按HOME键的Log日志:
E/MainActivity(22457): onCreate
E/ContentFragment(22457): onAttach
E/ContentFragment(22457): onCreate
E/ContentFragment(22457): onCreateView
E/ContentFragment(22457): onActivityCreated
E/MainActivity(22457): onStart
E/ContentFragment(22457): onStart
E/MainActivity(22457): onResume
E/ContentFragment(22457): onResume
E/ContentFragment(22457): onPause
E/MainActivity(22457): onPause
E/ContentFragment(22457): onStop
E/MainActivity(22457): onStop
E/MainActivity(22457): onStart
E/ContentFragment(22457): onStart
E/MainActivity(22457): onResume
E/ContentFragment(22457): onResume

2 0
原创粉丝点击