Fragment小结
Fragment是Android3.0之后增加的新特性,通常人们叫它碎片。可是,我认为把它理解成一个View模块比較好,尽管它不是继承自View。假设阅读过源代码就知道它是内置View对象从而实现View的特性。在设计模式里面通常说到,扩展一个类的方式有2种,第一就是类继承,第二就是对象组合,而开发经验告诉我们。要多用对象组合。所以Fragment是直接继承Object,组合View来实现View的特性的。
类继承:
这里先看一下Fragment的类继承结构:
生命周期:
Fragment与Activity一样具有生命周期,例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYW5kcm9pZF9kb25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
而Fragment的生命周期是附着在使用Fragment的Activity的生命周期之上。这里有个图片来比較下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYW5kcm9pZF9kb25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
源代码分析:
Fragment.java位于SDK的android.app包下,通过查看源代码,能够看到Fragment的实现方式是组合View对象和ViewGroup对象。在Fragment还有startActivity和startActivityFroResult方法,是不是跟Activity非常像?!在使用Fragment的时候一般要实现2个生命周期方法onCreate和onPause,方便保存数据,在重写onCreateView时,能够向ViewGroup对象container中加入某个布局文件代表的View。形如return
inflater.inflate(R.layout.yourlayout,container, false);
Fragment的基本运用
分为布局文件里使用Fragment和在程序中动态加入Fragment
布局文件里使用Fragment
第一步:为Fragment指定一个布局文件。例如以下fragmentlayout.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
第二步:自己写一个类MyFragment继承Fragment类
package com.example.myfragmentlayout;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class MyFragment extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragmentlayout, container, false);
}
}
重写onCreateView方法。返回自定义的Fragment的layout。这里注意onCreateView方法的參数ViewGroup对象!
特别注意。
第三步:在主Activity的布局文件activity_main.xml中这样写道
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<fragment
android:name="com.example.myfragmentlayout.MyFragment"
android:tag="dxd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
这里务必为fragment指定一个tag或是id属性。!
不然执行会出错。
在程序中动态加入Fragment
还记的重写Fragment中的onCreateView方法中的第二个參数吧,是ViewGroup对象。说明Fragment是被加入到ViewGroup对象中去的。从SDK文档中能够看到ViewGroup的子类是非常多的,这里截个图
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYW5kcm9pZF9kb25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
有了这个基础。我们在程序中动态加入Fragment.
前一二步都跟在布局文件里加入Fragment一样的,仅仅有在主Activity的layout文件里指定Fragment的方式不一样,这里我们指定的是一个ViewGroup子类。
第3步
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<FrameLayout
android:id="@+id/framelayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
这里定义的是FrameLayout对象,它是ViewGroup的子类,它作为一个容器把Fragment加入进去。
那么在程序中应该如何去加入呢?
package com.example.myfragmentlayout; import android.app.Activity;
import android.app.FragmentTransaction;
import android.os.Bundle; public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyFragment fragment = new MyFragment();
FragmentTransaction ft = getFragmentManager().beginTransaction() ;
ft.add(R.id.framelayout, fragment);
ft.commit() ;
}
}
从代码中能够看到,是将fragment对象增加到FrameLayout中去。
最后别忘了commit提交。这里必须注意了。对于同一个FragmentTransaction对象仅仅能提交一次!!
!
使用FragmentTransaction时须要多注意一下。
由此我们能够想象到。我们能够依据不同的需求选择适当的容器来装Fragment,如ScrollView,LinearLayout等
假设你通过继承LinearLayout来自己定义过控件,那么你肯定对Fragment有非常似成相识的感觉。当你继承LinearLayout时须要实现3个构造方法。在这3个构造方法中,你通过LayoutInflater将layout布局文件转换成View,然后为这个View赋予各种监听方法和事件响应。
反过来思考一下Fragment是不是这样实现的呢?当我们继承Fragment时,我们须要实现onCreateView方法,该方法中就是通过LayoutInflater对象将layout布局文件转换成View。然后为这个View加入各种响应时间和时间响应,最后加入到ViewGroup的子类中去。
Fragment的事务处理
Fragment的事物处理是通过FragmentTransaction来实现的,它是通过FragmentManager得到的。这里说一下它几个经常使用的方法:
add :向某个ViewGroup容器中加入Fragment对象
hide:隐藏某个Fragment。让其不可见。
remove:移除某个Fragment
show:显示某个Fragment
setCustomAnimations:指定Fragment切换时的动画
commit:提交,同一个FragmentTransaction仅仅能commit一次,不然会出错。
Fragment的综合应用:
模仿手机QQ主界面的4个视图。详情请见某大神的总结:http://blog.csdn.net/guolin_blog/article/details/13171191
Fragment小结的更多相关文章
- fragment 小结
1:注意事项 3.0以前的Android 版本要使用FragmentActivity 来装载Fragment ,使用到support v4包. 3.0以后的版本可以直接在Activity里面添 ...
- Android开发之漫漫长途 Fragment番外篇——TabLayout+ViewPager+Fragment
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- Wix 安装部署教程(十) --来,用WPF做个漂亮的安装界面
在上一篇中曾留下两个问题,.Net捆绑安装不触发以及路径选择的问题现在都已经解决,这段时间花的最多的地方还是WPF调样式上面,奈何WPF功力不够,暂时还是没有达到自己想要的效果.另外ViewModel ...
- bug_ _fragment的1
========= 2 fragment小结 ???? ======== 1 fragment:java.lang.IllegalStateException: Can not perf ...
- android Fragment 用法小结
Fragment 是android 3.0引入的新API,是作为Activity的子模块,必须嵌入Activity才能使用. Activity 与 Fragment的关系: 一.依附性: 1. Fra ...
- Android Fragment使用小结及介绍
目录(?)[-] 一什么是Fragment 二Fragment的生命周期 三Fragment的两种添加方式addreplace 四两种添加方式性能比较 偶记得第一次接触Fragment,觉得好牛叉的组 ...
- 小结Fragment与FragmentPagerAdapter的生命周期及其关系
本博客部分内容是来自http://blog.csdn.net/dreamzml/article/details/9951577 FragmentPagerAdapter FragmentPagerAd ...
- Android中Fragment与Activity之间的交互(两种实现方式)
(未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...
- 对于Fragment的一些理解
前言 Fragment想必大家不陌生吧,在日常开发中,对于Fragment的使用也很频繁,现在主流的APP中,基本的架构也都是一个主页,然后每个Tab项用Fragment做布局,不同选项做切换,使用起 ...
随机推荐
- 深入学习MongoDB
NoSQL(Not Only SQL)为什么使用NoSQL 对数据库高并发读写 对海量数据的高效存储与访问 对数据库的高可拓展性和高可用性 NoSQL的弱点 数据库事务一致性需求 数据库的写实时性和读 ...
- 【CF1043A】Elections(签到)
题意:给定n个数字,第i个为a[i],求使得sigma k-a[i]>sigma a[i]最小的k n,a[i]<=1e2 思路: #include<cstdio> #incl ...
- javascript获取querystring值【个人觉得这种方法最好最棒最像.NET】
原文发布时间为:2009-05-22 -- 来源于本人的百度文章 [由搬家工具导入] JavaScript获取QueryString值, 当没有QueryString值时输出bool型 null 用j ...
- duilib入门简明教程 -- XML配置界面(6) (转)
原文转自:http://www.cnblogs.com/Alberl/p/3343699.html 前面那些教程都是为了让小伙伴们从win32.MFC过渡到duilib,让大家觉得duilib ...
- c语言中的rewind函数,Win CE 不支持,可用fseek函数替换
FILE *read = fopen(cXmlFile,"rb"); if (read) { fseek(read, 0L, SEEK_END); int len = ftell( ...
- Android驱动之 Linux Input子系统之TP——A/B(Slot)协议【转】
转自:http://www.thinksaas.cn/topics/0/646/646797.html 将A/B协议这部分单独拿出来说一方面是因为这部分内容是比较容易忽视的,周围大多数用到input子 ...
- MPchartAndroid-柱状图
mChart = (LineChart) findViewById(R.id.chart1); mChart.setDescription(""); //设置图表描述信息 m ...
- hdu 5059(模拟)
Help him Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- AC日记——[Sdoi2016]数字配对 bzoj 4514
4514 思路: 很受伤现在,,测了那么多次不过的原因就是因为INF不够大: 解法有两种: 解法1: 把n个点按照质因数个数为奇或偶分为两个点集(很容易就可以想到): 然后,按照题目连边跑最大费用流: ...
- Unity工程资源破解
Unity工程资源提取其实还是很方便的,网上也有很多相关介绍,比如雨凇就专门写了一遍关于破解Unity资源的文章(http://www.xuanyusong.com/archives/3618 ...