【Android】Fragment的简单笔记
被虐了,做某公司笔试时,发现自己连个Fragment的生命周期都写不详细。平时敲代码,有开发工具的便利,有网上各大神的文章,就算忘了也很容易的可以查到,但当要自己不借助外界,却发现自己似乎对该知识点并不是很理解。
所以,还是老老实实的做好笔记。本篇随笔介绍的是Fragment,这类的文章网上很多,题主还是个小渣,就只是简单的记录,借机巩固基础,如果有理解错的地方,还望指点一下。
Fragment介绍
关于Fragment的介绍网上很多,有说是用来支持不同屏幕手机的布局的,官网上也介绍说能给用户提供一种动态、灵活的交互体验。
但对于一个新手来说,学习的层面,很少需要去考虑到适配不同屏幕手机的需求。毕竟新手更多的是学习一个知识点如何使用,而不是做一个产品出来。所以新手对Fragment接触的频率可能会比较少,毕竟简单的程序Activity就可以满足了。
题主也是小渣一枚,对于Fragment的理解,更多的是觉得它的动态增加、移除、替换非常实用。
因为新手学习常常是模仿一些比较出名的App,很多App都会有统一的标题栏、底部栏之类的,更换的只是内容区的界面,这种情况如果还只是用Activity来实现,项目里就会有大量重复的代码,后期需要修改某个地方,将是一件恐怖的事。所以,这时候使用Fragment就非常好了。
Fragment生命周期
Fragment是依附于Activity存活的,网上也说可以将Fragment看成是迷你型的Activity,这样一来,Fragment的生命周期也就很容易理解了。先附上张图:

因为Fragment是依附于Activity的,所以当Activity执行完onCreate后,Fragment也就相应的执行它的回调函数。
这里也很好理解,首先是先关联,关联成功后创建对象,接着创建视图。摧毁时正好反过来,先摧毁视图,然后摧毁对象,最后再取消关联。其他回调函数都跟Activity一样。
刚学习时可以把日志打印出来,自己琢磨几遍也就清楚流程了,如下图:
①onCreate --> onResume (onResume后Activity/Fragment就处于运行状态:可见,有焦点,可交互)

②onStop --> onRestart --> onResume (当活动从后台重新进入前台时执行的回调函数)

③摧毁过程

Fragment使用
首先是了解,了解完后就要开始学习该怎么使用了。网上都介绍说有两种方式,静态和动态。其实也就是要么在布局文件xml中直接把Fragment当成普通的组件使用,要么在java代码中动态的添加、替换、移除。有些类似于广播的使用方式。
①静态使用
首先先创建一个Fragment的布局文件:fragment_phone.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="PHONT" />
</LinearLayout>
然后创建一个FragmentPhone类继承自Fragment:FragmentPhone.java
public class FragmentPhone extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d(TAG, "onCreateView");
return inflater.inflate(R.layout.fragment_phone, container, false);
}
}
至于为什么要创建这个类,题主的理解是:因为要把Frament当成普通的组件在布局文件中使用,但Fragment的布局是由我们自己定义决定的,所以可以把它当成是自定义组件,那就按照自定义UI的方式来操作了。
onCreateView也就类似于Activity的onCreate,我们需要在这里为我们的Fragment指定相应的布局文件。
最后就是在Activity的布局文件中使用:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.iwin.fragment01.MainActivity"
tools:showIn="@layout/app_bar_main">
<fragment
android:name="com.iwin.fragment01.FragmentPhone"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
使用fragment标签,和android:name属性来指定具体的Fragment就大功告成了。
总结下,静态使用方法:创建Fragment布局文件 ---> 创建FragmentPhone类继承Fragment,在onCreateView方法中指定布局文件 ---> 使用fragment标签和android:name属性来指定使用哪个Fragment。
②动态使用
首先创建Fragment布局文件,跟静态使用时第一步一样。
然后创建Fragment***类继承Fragment,在onCreateView方法中指定布局文件,仍然跟静态使用的第二步一样。
最后在Activity类的onCreate方法中使用:
public class MainActivity extends AppCompatActivity {
private FragmentPhone fphone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG,"onCreate");
setContentView(R.layout.activity_main);
if (savedInstanceState == null){
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
fphone = new FragmentPhone();
ft.add(R.id.content,fphone);
ft.commit();
}
}
}
先获取FragmentManager的对象,然后开启一个事务,指定操作(添加,替换,移除,隐藏等),最后提交事务就可以了。
至于为什么要通过事务来操作Fragment,题主的理解是:因为一个过程我们可以指定多个操作,比如隐藏当前Fragmetn,然后再添加一个新的Fragment进来等等,如果在完成部分操作时程序出问题了,那么这时界面就会处于一个奇怪的现状。而事务可以保证操作要么全部完成,要么一个都不做。
其实也就是从数据库的事务概念来理解了,也不知道对不对,至少这样理解可以加深点印象。
对Fragment的操作(添加,替换,移除等)需要通过FragmentTransaction提供的API来操作,FragmentRransaction实例可以通过FragmentManager类的benginTransaction()获得。而FragmentManager的实例则可以通过Activity的getFragmentManager()获取。
**对Fragment的操作示例:(ft是FragmentTransaction 的一个实例对象。) **
添加
ft.add(R.id.content,fphone);
第一个参数是指定一个来放置你的Fragment的ViewGroup(FrameLayout等),第二个参数就是一个Fragment的实例对象。
替换
ft.replace(R.id.content,fcamera);
参数同上。
**总结下,动态使用Fragment前两步跟静态一样,需要创建Fragment布局文件和类 ---> 通过Activity的getFragmentManager()获取FragmentManager实例 ---> 通过FragmentManager的beginTransaction()获取FragmentTransaction的实例 ---> 调用获取FragmentTransaction的API,如ft.add(要放置Fragment的ViewGroup,Fragment实例) ---> 提交事务如ft.commit() **
暂时就先记录这些基础的知识点了,后面等用多了Fragment,对于与Activity的通信,以及一些其他特殊的用法熟悉了再来做笔记。
【Android】Fragment的简单笔记的更多相关文章
- [置顶]
xamarin android Fragment实现底部导航栏
前段时间写了篇关于Fragment的文章,介绍了基础的概念,用静态和动态的方式加载Fragment Xamarin Android Fragment的两种加载方式.下面的这个例子介绍xamarin ...
- Android编程权威指南笔记3:Android Fragment讲解与Android Studio中的依赖关系,如何添加依赖关系
Android Fragment 当我在学习时,了解了Fragment词汇 Fragment是一种控制器对象,我就把所了解的简单说一下.activity可以派fragment完成一些任务,就是管理用户 ...
- Android Fragment 简单实例
Android上的界面展示都是通过Activity实现的.Activity实在是太经常使用了.我相信大家都已经很熟悉了,这里就不再赘述. 可是Activity也有它的局限性,相同的界面在手机上显示可能 ...
- Android开发——Fragment的简单使用总结
前言: 之前搞项目的时候,就使用了这个Fragment,中间遇到了许多坑,把坑都解决了,现在写一篇较为简单的Fragment使用总结 Fragment的简单介绍: 简单来说,Fragment其实可以理 ...
- Android Fragment(三)ListFragment简单介绍以及Fragment之间通信
一.Fragment通信简单介绍:Fragments之间是不能够直接通信的,他们之间的通信是通过Activity这个中间件来通信的, 为了让Fragment跟它的Activity通信,我们可以在Fra ...
- Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复
Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...
- Android Fragment 剖析
1.Fragment如何产生?2.什么是Fragment Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视.针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后 ...
- 【Android自学日记】【转】Android Fragment 真正的完全解析(下)
上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和各种API,如果你还不了解,请看:Android Fragment 真正的完全解析(上). 本篇将介绍上篇博客提到的:如何管理Frag ...
- 【Android自学日记】【转】Android Fragment 真正的完全解析(上)
自从Fragment出现,曾经有段时间,感觉大家谈什么都能跟Fragment谈上关系,做什么都要问下Fragment能实现不~~~哈哈,是不是有点过~~~ 本篇博客力求为大家说明Fragment如何产 ...
随机推荐
- 扒皮下GitHub 404的图片层次轴动特效
今天要克隆的前端特效非常有意思,可以参见GitHub404页面 https://github.com/vajoy/master/index.html 记得之前华为在站酷发布EMUI设计大赛的主页也用了 ...
- [翻译]理解Ruby中的blocks,Procs和lambda
原文出处:Understanding Ruby Blocks, Procs and Lambdas blocks,Procs和lambda(在编程领域被称为闭包)是Ruby中很强大的特性,也是最容易引 ...
- git/ssh捋不清的几个问题
主要是 windows 用户会遇到很多纠结的问题,linux/unix 用户属于这方面的高端用户,应该有能力处理此类问题,而且网络上也有很多解决方案,本文的授众是 windows 用户.由于今天配置了 ...
- 用Nim语言开发windows GUI图形界面程序
前言 本文得到了“樂師”的大力支持, 我们一起调试程序到深夜,要是没有他的帮忙, 我不知道要多久才能迈过这道坎, 另外“归心”还有其他人也提供了帮助, 他们都来自于QQ群:“Nim开发集中营”4693 ...
- 系统架构:Web应用架构的新趋势---前端和后端分离的一点想法
最近研究servlet,看书时候书里讲到了c/s架构到b/s架构的演变,讲servlet的书都很老了,现在的b/s架构已经不是几年前的b/s架构,其实b/s架构就是web应用开发,对于这样的架构我们现 ...
- [ZigBee] 11、ZigBee之睡眠定时器二
1.前言 上一节讲了Zigbee的睡眠定时器利用外部按键使系统从休眠态唤醒到工作态,其核心在于: 61 void SysPowerMode(uchar mode) 62 { 63 if(mode &g ...
- iphone按home键后,正在运行的程序是否退出了呢?
是否一直有个疑问,当iphone手机正在运行一个APP,如果按Home键后,那么原来正在运行的程序还在运行吗?如果开发过ios程序,可能不是问题,如果没有开发过的,可能会疑惑了,我就简单的说一下.以几 ...
- 哪些JavaScript IDE最好用?
阅读本文之前,分享大家一张图片,看图会发现JavaScript开发需求最高,占比达到42.84%,因此掌握JavaScript语言好工作就不愁啦,工欲善其事必先利其器,那么选择IDE来开发是至关重要的 ...
- java ExecutorService
ExecutorService 通常Executor对象会创建并管理一组执行Runnable对象的线程,这组线程被称为线程池,Executor基于生产者-消费者模式.提交任务的执行者是生产者(产生待完 ...
- Jsp+ Servlet+Ajax实现点赞功能
1.jsp页面,使用ajax实现局部刷新 2.servlet接受处理去更新数据库 随后上传