被虐了,做某公司笔试时,发现自己连个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的简单笔记的更多相关文章

  1. [置顶] xamarin android Fragment实现底部导航栏

    前段时间写了篇关于Fragment的文章,介绍了基础的概念,用静态和动态的方式加载Fragment  Xamarin Android Fragment的两种加载方式.下面的这个例子介绍xamarin ...

  2. Android编程权威指南笔记3:Android Fragment讲解与Android Studio中的依赖关系,如何添加依赖关系

    Android Fragment 当我在学习时,了解了Fragment词汇 Fragment是一种控制器对象,我就把所了解的简单说一下.activity可以派fragment完成一些任务,就是管理用户 ...

  3. Android Fragment 简单实例

    Android上的界面展示都是通过Activity实现的.Activity实在是太经常使用了.我相信大家都已经很熟悉了,这里就不再赘述. 可是Activity也有它的局限性,相同的界面在手机上显示可能 ...

  4. Android开发——Fragment的简单使用总结

    前言: 之前搞项目的时候,就使用了这个Fragment,中间遇到了许多坑,把坑都解决了,现在写一篇较为简单的Fragment使用总结 Fragment的简单介绍: 简单来说,Fragment其实可以理 ...

  5. Android Fragment(三)ListFragment简单介绍以及Fragment之间通信

    一.Fragment通信简单介绍:Fragments之间是不能够直接通信的,他们之间的通信是通过Activity这个中间件来通信的, 为了让Fragment跟它的Activity通信,我们可以在Fra ...

  6. Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复

    Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...

  7. Android Fragment 剖析

    1.Fragment如何产生?2.什么是Fragment Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视.针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后 ...

  8. 【Android自学日记】【转】Android Fragment 真正的完全解析(下)

    上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和各种API,如果你还不了解,请看:Android Fragment 真正的完全解析(上). 本篇将介绍上篇博客提到的:如何管理Frag ...

  9. 【Android自学日记】【转】Android Fragment 真正的完全解析(上)

    自从Fragment出现,曾经有段时间,感觉大家谈什么都能跟Fragment谈上关系,做什么都要问下Fragment能实现不~~~哈哈,是不是有点过~~~ 本篇博客力求为大家说明Fragment如何产 ...

随机推荐

  1. Unity3d热更新全书-加载(一)从AssetBundle说起

    Unity3D动态下载资源,有没有解?有,AssetBundle就是通用解,任何一本书都会花大幅篇章来介绍AssetBundle. 我们也来说说AssetBundle 我们试全面的分析一下Unity3 ...

  2. 12小时包你学会基于ReactMix框架的ReactNativeApp开发(一)Hello World!

    ReactMixhttps://github.com/xueduany/react-mix自从昨天发布起来,得到了不少小伙伴的热捧,很高兴帮助大家解决了憋在心中很久的问题“如果我只会HTML,Css, ...

  3. 浅析SQL Server实现分布式事务的两阶段提交协议2PC

    不久之前团队有个新人问我一个很重要的web服务接口如何保证事务的问题.因为涉及到跨库事务,当时我只是回答目前我们的SOA框架都不支持跨库事务.然后就问到了数据库跨库事务是如何实现的,我只能凭印象含糊回 ...

  4. lua实现深度拷贝table表

    lua当变量作为函数的参数进行传递时,类似的也是boolean,string,number类型的变量进行值传递.而table,function,userdata类型的变量进行引用传递.故而当table ...

  5. python学习 变量的操作 与 基本数据类型

    一变量(本文使用python3.5): #变量:是计算机内存中的一块区域,变量可以存储规定范围内的值,变量可以改变#在python中变量是计算机内存中数据的引用 python的变量没有明显的类型,具体 ...

  6. SQLServer查看死锁

    SQLServer查看死锁 if exists ( select * from sys.procedures where name like '%USP_ShowLocks%' ) drop proc ...

  7. Jasmine入门(上)

    什么是Jasmine Jasmine是一个Javascript的BDD(Behavior-Driven Development)测试框架,不依赖任何其他框架. 如何使用Jasmine 从Github上 ...

  8. java基础-继承:矩形体积类问题

    28.按要求编写一个Java应用程序: (1)定义一个类,描述一个矩形,包含有长.宽两种属性,和计算面积方法. (2)编写一个类,继承自矩形类,同时该类描述长方体,具有长.宽.高属性, 和计算体积的方 ...

  9. sql语句执行顺序

    首先来一张朋友传给我的图 FORM: 对FROM的左边的表和右边的表计算笛卡尔积.产生虚表VT1 ON: 对虚表VT1进行ON筛选,只有那些符合<join-condition>的行才会被记 ...

  10. ROC曲线与AUC值

    本文根据以下文章整理而成,链接: (1)http://blog.csdn.net/ice110956/article/details/20288239 (2)http://blog.csdn.net/ ...