分类: Android基础2013-10-03 08:23 92人阅读 评论(0) 收藏 举报
 

目录(?)[+]

 

1.Fragment概述

在一个Activity中, Fragment代表UI的一个部分或者一个行为。一个Activity可以结合多个Fragment对象,也可以在多个activity中使用相同Fragment字节码对应的不同对象。一个Fragment对象必须被嵌入在一个主Activity对象中,该Fragment的生命周期与主Activity息息相关。比如,当主Activity处于paused状态,其对应的所有Fragment对象均处于paused状态,只有当主Activity处于resumed状态时,Fragment才能处于自由控制状态。

2.创建Fragment

为了创建一个Fragment,应该去继承Fragment或者其子类,覆写相应的方法。比如onCreate(),OnCreateView(),onPause()等等

(1).添加UI界面

为该Fragment展现一个布局,必须去实现onCreateView()回掉方法。
注意:当该Fragment继承了ListFragment时,不需要覆写onCreateView()方法,因为默认返回一个ListView对象

  1. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  2. Bundle savedInstanceState) {
  3. View view = inflater.inflate(R.layout.list, null);
  4. return view;
  5. }

(2).添加Fragment到Activity

1).通过layout布局文件

android:name属性应该为Fragment对应类的完整路径。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="horizontal" >
  6. <fragment
  7. android:id="@+id/list"
  8. android:name="com.example.news.ArticleListFragment"
  9. android:layout_width="0dp"
  10. android:layout_height="match_parent"
  11. android:layout_weight="1" />
  12. <fragment
  13. android:id="@+id/viewer"
  14. android:name="com.example.news.ArticleReaderFragment"
  15. android:layout_width="0dp"
  16. android:layout_height="match_parent"
  17. android:layout_weight="2" />
  18. </LinearLayout>

2).通过Java代码

当Activity运行时,可以自由的在该activity上添加fragment对象,但应该指定一个ViewGroup容器,可以FragmentTransaction完成fragment的添加移除或者替换。

  1. manager = getFragmentManager();
  2. if(manager.findFragmentByTag("right") == null){
  3. manager.beginTransaction().replace(R.id.right, new RightFrag(), "right").commit();
  4. }

(3).fragment唯一标示符

每个fragment需要定义一个唯一的标识符,如果activity被销毁又重新启动,系统能够恢复该fragment的状态。如果想重新恢复,需满足下面有3种方式之一:

1).定义ID

在布局文件中,定义android:id属性

  1. <fragment
  2. android:id="@+id/list"
  3. android:name="com.example.news.ArticleListFragment"
  4. android:layout_width="0dp"
  5. android:layout_height="match_parent"
  6. android:layout_weight="1" />

2).指明tag

android:tag 指明 或者 一个fragment对象add()或者replace()时指定tag

  1. <fragment
  2. android:id="@+id/list"
  3. android:tag="first"
  4. android:name="com.example.news.ArticleListFragment"
  5. android:layout_width="0dp"
  6. android:layout_height="match_parent"
  7. android:layout_weight="1" />

或者

  1. manager.beginTransaction()
  2. .replace(R.id.right, new RightFrag(), "right")//在事务中指明该fragment的tag
  3. .commit();

3).viewgroup ID

如果该fragment均没有id和tag,系统将使用container view布局的id

3.Fragment的管理

通过getFragmentManager()方法,可以得到FragmentManager对象,主要完成下面的功能

  1. FragmentManager manager = getFragmentManager();

(1).得到已经存在Fragment对象

如果该fragment在布局文件中指定了id,通过findFragmentById()得到对象,或者指定了tag可以通过findFragmentByTag()得到对象

  1. Fragment fragment = getFragmentManager().findFragmentByTag("right");
  2. //or
  3. Fragment fragment = getFragmentManager().findFragmentById(id);

(2).注册OnBackStackChangedListener监听器

可以用来监听该任务对应的返回栈信息,当该返回栈状态发生改变时,执行对应的onBackStackChanged() 方法

  1. manager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
  2. @Override
  3. public void onBackStackChanged() {
  4. Toast.makeText(MainActivity.this, "返回堆状态发生改变", 1).show();
  5. }
  6. });

(3).弹出返回栈

模拟用户点击返回键,将指定的fragment从返回栈中弹出,该操作为异步的。前提是该fragment对象使用.beginTransaction().addToBackStack("right")添加了进返回栈

  1. manager.popBackStack(); //Pop the top state off the back stack

(4).FragmentTransaction事务

事务主要包含一些操作的集合,比如增加移除替换,动画设置等等

  1. /*
  2. * 通过manager开启一个事务,该事务包含一些操作的集合,通事务可以 add(), remove(), replace()
  3. * 完成对Fragment的操作,并使用commit()提交
  4. */
  5. FragmentTransaction transaction = manager.beginTransaction();
  6. transaction.replace(R.id.right, new RightFrag(), "right");
  7. transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);//设置动画
  8. transaction.addToBackStack("right"); // 将该fragment加入返回堆
  9. // 提交事务
  10. transaction.commit();

(5).Fragment状态管理

  1. /*
  2. * 管理Fragment的状态
  3. *  如果在一个主activityViewGroup中添加一个fragment,
  4. *  如果手机屏幕旋转了,当前activity被销毁重建,fragment也被activityManager创建
  5. *  故在onCreate中,需要判断一下
  6. */
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11. manager = getFragmentManager();
  12. if (manager.findFragmentByTag("right") == null) {
  13. // if(savedInstanceState == null)也可判断该fragment是否已经加载
  14. manager.beginTransaction()
  15. .replace(R.id.right, new RightFrag(), "right")
  16. .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)// 设置动画
  17. .addToBackStack("right") // 将该fragment加入返回堆
  18. // 提交事务
  19. .commit();
  20. }
  21. }

4.Fragment间信息交互

(1).取得对象

  1. /*
  2. * 点击该Fragment的button按钮,将该button的text设置为另一个fragment中Edittext的文本值
  3. */
  4. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  5. Bundle savedInstanceState) {
  6. View view = inflater.inflate(R.layout.list, null);
  7. final Button button = (Button) view.findViewById(R.id.confirm);
  8. button.setOnClickListener(new View.OnClickListener() {
  9. @Override
  10. public void onClick(View v) {
  11. //通过FragmentManager找到另一个fragment中的edittext对象,并取得text内容
  12. EditText editText = (EditText)(getFragmentManager().findFragmentByTag("left").getView().findViewById(R.id.name));
  13. button.setText(editText.getText().toString());
  14. }
  15. });
  16. return view;
  17. }

(2).通回掉函数

  1. public class MainActivity extends Activity {
  2. private FragmentManager manager;
  3. private Button button;
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_main);
  8. button.setOnClickListener(new View.OnClickListener() {
  9. @Override
  10. public void onClick(View v) {
  11. RightFragment rightFrag = (RightFragment) (getFragmentManager().findFragmentByTag("right"));
  12. /*
  13. * 通过set方法,向其传递一个实例化对象,由于rightFrag.set()方法内部执行RightFragment.CallBack.get()方法,完成了参数的传递
  14. */
  15. rightFrag.set(new RightFragment.CallBack() {
  16. @Override
  17. public void get(String str) {
  18. button.setText(str);
  19. }
  20. });
  21. }
  22. });
  23. }
  24. }
  1. public class RightFragment extends ListFragment {
  2. private LoaderManager manager;
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. manager = getLoaderManager();
  7. }
  8. /*
  9. * 点击该Fragment的button按钮,将该button的text设置为另一个fragment中Edittext的文本值
  10. */
  11. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  12. Bundle savedInstanceState) {
  13. View view = inflater.inflate(R.layout.list, null);
  14. return view;
  15. }
  16. /**
  17. * 通过调用该方法,接收一个回掉函数对象,callBack.get(str);
  18. * @param callBack
  19. */
  20. public void set(CallBack callBack) {
  21. EditText editText = (EditText) getView().findViewById(R.id.name);
  22. callBack.get(editText.getText().toString());
  23. }
  24. /*
  25. * 回掉接口
  26. */
  27. interface CallBack {
  28. public void get(String str);
  29. }
  30. }

5.Fragment的生命周期

(1).生命周期路线图

生命状态

周期过程

 

foreground lifetime

onResume(A)

onResume(F)

onPause(F)

onPause(A)

visible lifetime

onCreateView(F)

onActivityCreated(F)

onStart(A)

onStart(F)

onResume(A)

onResume(F)

onPause(F)

onPause(A)

onStop(F)

onStop(A)

onDestroyView(F)

entire lifetime

完整的生命周期

(2).生命周期回掉函数概述

方法 描述
onAttach(Activity)

当前Fragment与Activity关联,调用!

onCreate()

完成fragment的初始化创建

  onCreateView()

创建并返回与当前fragment相关联的层次视图view

  onActivityCreated()

主activity的onCreate()执行完后,该方法才执行

  onStart()

fragment可见,当主activity处于started状态后执行

    onResume()

fragment能与用户交互,当主activity处于resumed状态后执行

    onPause()

fragment不在与用户交互,可能在主activity将要处于paused前执行,可能该fragment被修改

  onStop()

fragment不在可见,可能在主activity将要处于stopped前执行,可能该fragment被修改

  onDestroyView()

允许该fragment清理视图相关资源

onDestroy()

清理掉视图state信息

onDetach()

该fragment不在于activity关联

Android_Fragment_Fragment详解的更多相关文章

  1. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  2. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  3. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  4. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  5. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  6. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  7. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

  8. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  9. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

随机推荐

  1. [BZOJ1294][SCOI2009]围豆豆Bean 射线法+状压dp+spfa

    1294: [SCOI2009]围豆豆Bean Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 458  Solved: 305[Submit][Sta ...

  2. 图文详解前端CSS中的Grid布局,你真的可以5分钟掌握

    前言 网站的布局是一个网站设计的根本,CSS的Grid布局已经成为了未来网站布局的基本方式. 今天这篇文章我们通过图文,一起看看如何自己实现Grid布局方式. CSS 第一个Grid布局 首先我们看看 ...

  3. Matlab与C++混合编程,添加OpenCV库

    最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍受.软件立刻移植到C++上又不太实际,故采用联合编程的方式,速度难 ...

  4. @Transactional注解事务不起作用

    @Transactional注解事务不起作用 问题:今天在项目中碰到一个事务问题,使用@Transactional注解事务,抛出异常不会滚. 解决一:https://blog.csdn.net/u01 ...

  5. log4j配置文件中的additivity属性

    它是 子Logger 是否继承 父Logger 的 输出源(appender)的标志位.具体说,默认情况下子Logger会继承父Logger的appender,也就是说子Logger会在父Logger ...

  6. ThinkPHP的自动验证常用的正则

    ThinkPHP的自动验证常用的正则   ThinkPHP的自动验证机制是为了进行表单数据验证,验证可以支持function. callback.confirm.equal.unique和regex, ...

  7. 写了一个远程桌面管理的Visual Studio扩展程序

    最近看了写Visual Studio扩展相关的一些资料,周末写了一个远程桌面管理器的扩展程序来练练手,由于和VisualStudio集成了,无需切换窗口,用起来还是觉得挺方便的. 关于远程桌面管理器的 ...

  8. UBI文件系统简介

    转:http://www.embedu.org/Column/Column102.htm 在linux-2.6.27以前,谈到Flash文件系统,大家很多时候多会想到cramfs.jffs2.yaff ...

  9. Shell--变量的显示与设置、环境变量、语系变量

    1.变量的显示与设置:echo,unsetecho:显示一段文字,也可以读出变量内容并打印出来  格式echo $变量或者echo ${变量}语 法:echo [-neE][字符串]或 echo [- ...

  10. 前端打包利器:webpack工具

    一.什么是WebPack,为什么要使用它? 1.为什要使用WebPack 现今的很多网页其实可以看做是功能丰富的应用,它们拥有着复杂的JavaScript代码和一大堆依赖包.为了简化开发的复杂度,前端 ...