前言:

之前搞项目的时候,就使用了这个Fragment,中间遇到了许多坑,把坑都解决了,现在写一篇较为简单的Fragment使用总结

Fragment的简单介绍:

简单来说,Fragment其实可以理解为一个具有自己生命周期的控件,只不过这个控件又有点特殊,它有自己的处理输入事件的能力,有自己的生命周期,又必须依赖于Activity,能互相通信和托管。

使用Fragment可以精简Activity文件的代码,便于更好的阅读,同时,有着更好的速度加载

使用Fragment的另外一种情况是可以在平板和手机显示不同的界面,由于没有接触平板电脑APP的开发,所以这个方面就不说明了。

Fragment的使用:

目录:

1.创建Fragment及Fragment对应的布局文件

2.使用静态方法创建Fragment(xml文件中使用)

3.动态创建并使用Fragment(java代码)

4.通过FragmentManager的方法来找到静态方法创建的Fragment实例

5.Fragment像activity一样使用

6.Fragment的生命周期

7.Fragment的消息传递(重点)

8.Fragment点击事件冲突处理

1.创建Fragment及Fragment对应的布局文件

创建的话我们可以通过手动创建一个Fragment文件及一个xml布局文件,之后在Fragment的onCreateView方法中调用inflate来返回一个View

其实Android Studio给我们提供了一个很好的自动化生成Fragment及布局文件工具,我们直接new,选择Fragment->blank即可

至于其他的几种Fragment,有兴趣可以百度找资料

之后我们来到了新建的界面,Android Studio会自动生成Fragment与Fragment对应的布局,而且代码中也是帮我们加上了之前的那一行代码来刷新视图

为了方便下面的使用,我们简单地将fragment__test这个布局文件的背景设置为红色

2.使用静态方法创建Fragment(xml文件中使用)


<fragment
android:id="@+id/fragmetn1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.wan.fragmenttest.TestFragment"
tools:layout="@layout/fragment_test"/>

上面的代码即是添加Fragment的代码,和我们使用控件差不多,就是需要使用name这个属性来指定相关的Fragment

id是必须的,没有的话就会出现闪退,tools:layout是用来显示当前的Fragment,没有的话预览图就是灰色的,可用可不用,不过方便查看效果还是用吧

我们这样就是成功的用静态方法使用了一个Fragment

3.动态创建并使用Fragment(java代码)

首先,我们把之前的在activity布局文件中的Fragment给删除,换成一个framelayout,并给其定义了一个id

之后,我们new一个Fragment,使用FragmentTransaction的add或者是replace方法,将其放入一个framelayout之中

FragmentTransaction由FragmentManager的beginTransaction方法获得

add方法第一个参数为一个layout布局,就是我们之前的那个framelayout的id,第二个则是fragment,我们之前new的一个TestFragment,commit提交事务,不提交事务是无效的,不信的话可以自行测试

PS:这里需要注意一下,Fragment有两个不同的包,一个是app,另外一个是v4

由图中可以看到,这两个有什么区别呢?

android.support.v4.app.fragment包是为可以向下兼容至1.6系统.

android.app.fragment包是3.0系统以后的才能使用的,不过这也无所谓了,现在android4.0已占用了百分之九十九的市场

我们使用app这个包就好

如果使用的是v4包的话,获得FragmentManager需要使用getSupportFragmentManager方法

如果使用的是app包的话,直接使用getFragmentManager方法来获得FragmentManager

动态的我们只能运行来查看测试结果,可以看到与之前使用静态方法是一样的界面

4.通过FragmentManager的方法来找到静态方法创建的Fragment实例

两种方法:

findFragmentById方法与findFragmentByTag

我们在xml中定义一个id,之后可以通过findFragmentById方法找到实例

同样的道理,我们在xml中给Fragment定义一个Tag,之后就可以通过findFragmentByTag方法来找到实例

使用Fragment有两种方法我们可以通Fragment

5.Fragment像activity一样使用

如果我们的Fragment中使用了button等控件,那么,我们可以像activity中,通过findViewbyid方法来找到控件的实例,并为其设置监听器

不过,需要注意的是,Fragment只有在View被创建之后才能通过findviewbyid找到控件的实例,也就是只有在onViewCreated中才能使用findviewbyid方法

6.Fragment的生命周期

Fragment                                      

1. 界面打开     
onCreate() 方法执行!
onCreateView() 方法执行!
onActivityCreated() 方法执行!
onStart() 方法执行!
onResume() 方法执行! 2. 按下主屏幕键/锁屏
onPause() 方法执行!
onStop() 方法执行! 3. 重新打开
onStart() 方法执行!
onResume() 方法执行! 4. 按下后退键
onPause() 方法执行!
onStop() 方法执行!
onDestroyView() 方法执行!
onDestroy() 方法执行!
onDetach() 方法执行! 在Activity中加入Fragment,对应的生命周期
1. 打开
Fragment onCreate() 方法执行!
Fragment onCreateView() 方法执行!
Activity onCreate() 方法执行!
Fragment onActivityCreated() 方法执行!
Activity onStart() 方法执行!
Fragment onStart() 方法执行!
Activity onResume() 方法执行!
Fragment onResume() 方法执行! 2. 按下主屏幕键/锁屏
Fragment onPause() 方法执行!
Activity onPause() 方法执行!
Fragment onStop() 方法执行!
Activity onStop() 方法执行! 3. 再次打开
Activity onRestart() 方法执行!
Activity onStart() 方法执行!
Fragment onStart() 方法执行!
Activity onResume() 方法执行!
Fragment onResume() 方法执行! 4. 按下后退键
Fragment onPause() 方法执行!
Activity onPause() 方法执行!
Fragment onStop() 方法执行!
Activity onStop() 方法执行!
Fragment onDestroyView() 方法执行!
Fragment onDestroy() 方法执行!
Fragment onDetach() 方法执行!
Activity onDestroy() 方法执行!

7.Fragment的消息传递

在activity中,我们使用Bundle来携带数据进行传递,在Fragment中,也是使用的Bundle

如何使用呢?

首先,为Fragment创建一个静态方法newInstance

我们可以直接输入newInstance,就会出现代码补全提示,选择之后就会补全了代码

方法如上所示,首先,创建了一个Bundle的对象和一个TestFragment的对象,调用Fragment中的setArguments,将bundle存放进去,之后,返回一个TestFragment

这里的bundle还没有携带任何的数据,现在我们想传入一个String的数据,代码如下所示

这样我们就完成了传递数据,但是,还差一步,我们得接收数据,由之前的 生命周期,我们可以知道,onCreate方法是第一步执行的,所以,在onCreate方法中接收Bundle传来的数据

接收数据前,我们得在Fragment文件中声明几个全局变量,用来接收数据

这样便是完成了消息的传递

补充参考:Android开发——fragment中数据传递与刷新UI(更改控件)

8.Fragment点击事件冲突处理

图中,有两个日记,点击就会弹出查看日记

由图中可以看到,我们的点击透过了当前的Fragment,这显然不是我们想要的结果,我们应该怎么做呢?答案很简单,就是给当前显示出的那个Fragment添加一个onTouch监听器

PS:在Fragment中可以通过getActivity方法获得context

Android开发——Fragment的简单使用总结的更多相关文章

  1. Android开发——Fragment知识整理(二)

    0.  前言 Android开发中的Fragment的应用非常广泛,在Android开发--Fragment知识整理(一)中简单介绍了关于Fragment的生命周期,常用API,回退栈的应用等知识.这 ...

  2. Android开发——Fragment知识整理(一)

    0.  前言 Fragment,顾名思义是片段的意思,可以把Fragment当成Activity的一个组成部分,甚至Activity的界面可以完全有不同的Fragment组成.Fragment需要被嵌 ...

  3. Android 关于Fragment一些简单注意事项

    1.Fragment的生命周期一定要了解清楚: 其实没有什么好说的. 注意关键字所执行的方法: 注意下面基本fragmentTransaction.replace();运行 当FragmentA(初始 ...

  4. 【Android】Fragment的简单笔记

    被虐了,做某公司笔试时,发现自己连个Fragment的生命周期都写不详细.平时敲代码,有开发工具的便利,有网上各大神的文章,就算忘了也很容易的可以查到,但当要自己不借助外界,却发现自己似乎对该知识点并 ...

  5. Android开发 ---Fragment片段布局

    前言 Fragment想必大家不陌生吧,在日常开发中,对于Fragment的使用也很频繁,现在主流的APP中,基本的架构也都是一个主页,然后每个Tab项用Fragment做布局,不同选项做切换,使用起 ...

  6. Android开发Fragment的使用学习

    基本概念 Fragment是Android3.0(API11)提出的概念,support-v4库中也开发了一套Fragment API,最低兼容Android 1.6.所以在开发中要注意不要导错包 导 ...

  7. android开发 Fragment嵌套调用常见错误

    在activity中有时须要嵌套调用fragment,但嵌套调用往往带来视图的显示与预期的不一样或是fragment的切换有问题.在使用时要注意几点: 1.fragment中嵌套fragment,子f ...

  8. Android开发手记(25) 简单Service的实现

    本文将通过实现一个简单的Service发送简单消息,然后通过一个BroadcastReceiver接收Service发送的消息,从而改变一个TextView的文本颜色. 这里,我们需要三个java文件 ...

  9. Android开发——fragment中数据传递与刷新UI(更改控件)

    数据传递: 1.通过数据库进行数据的传递 如在fragment中将数据保存在数据库中,之后其他的fragment或者activity直接读取数据库中的数据,数据库使用还算简单,这里就不多说,建议使用l ...

随机推荐

  1. 面试为什么需要了解JVM

    匠心零度 转载请注明原创出处,谢谢! 说在前面 如果你经常注意面试题,你会发现现在面试题多多少少会含有jvm相关的面试题,之前也把一些jvm面试题汇总了下:面试题系列一,那么为什么现在面试需要了解或者 ...

  2. 左连接条件与where条件的区别

    Sql 查询语句应用左连接时的链接条件中经常加一些常量值在里面如: "On a.id= b.id and b.is_del =0 and b.is_old =1" 这种条件如果加在 ...

  3. linux iptables扩展,脚本防火墙

    netfileter:防火墙内核态ip tables:防火墙用户态(管理防火墙规则) iptables的表和链表包括不同的链,链包括大量的规则4个表: raw,mangle,nat,filter5种链 ...

  4. 【Unity3D】Unity3D 摄像机带透明截图

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/CropCamera.html ↓↓↓下面的废话可以不看↓↓↓ 最近处理了一批我的游戏的图标,步骤特别繁琐, 需要先 ...

  5. R语言实现︱局部敏感哈希算法(LSH)解决文本机械相似性的问题(二,textreuse介绍)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 上一篇(R语言实现︱局部敏感哈希算法(LSH) ...

  6. arm_linux_device_mem内存映射

    /dev/mem: 物理内存的全镜像.可以用来访问物理内存. /dev/kmem: kernel看到的虚拟内存的全镜像.可以用来访问kernel的内容. /dev/mem 用来访问物理IO设备比如X ...

  7. uclibc和glibc的差别

    uClibc和Glibc并不相同,两者有许多不同之处,而且以下不同有可能给你带来一些问题. 1. uClibc比Glibc小,虽然uClibc和Glibc在已有的接口上是兼容的,而且采用uClibc编 ...

  8. Nginx HTTP模块指令

    alias 指令 该指令用于在url和系统路径之间的映射. location /a/{ alias /b/; } error_page 定义错误页面 error_page 404 /404.html; ...

  9. 个性化WinPE封装方法 ----最后实战“制作WinPE3.0图文教程”

    经过前几讲,主要目的就是准备一些"原材料",熟悉一些"命令",实际上是"战前演练准备".下面要进入"实战状态",成败在此 ...

  10. CentOS使用nmcli配置网络

    nmcli 查看网络设备信息 nmcli dev status 查看所有连接的列表 nmcli connection show nmcli connection show --active 查看活动连 ...