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做布局,不同选项做切换,使用起 ...
随机推荐
- 控制台或Winform程序中如何编码或解码Server.URLEncode
原文发布时间为:2010-07-10 -- 来源于本人的百度文章 [由搬家工具导入] 在Asp.net中可以使用Server.HTMLEncode和Server.URLEncode 将文本或URL的特 ...
- HTTP调试工具:Fiddler介绍
原文发布时间为:2010-08-25 -- 来源于本人的百度文章 [由搬家工具导入] 这个工具我已经使用比较长时间了,对我的帮助也挺大,今天我翻译的微软的文章,让更多的朋友都来了解这个不错的工具,也是 ...
- http://store.microsoft.com/home.aspx
原文发布时间为:2009-07-26 -- 来源于本人的百度文章 [由搬家工具导入] http://store.microsoft.com/home.aspx
- 嵌入式 Linux线程锁详解pthread_mutexattr_t【转】
转自:http://blog.sina.com.cn/s/blog_8795b0970101il6g.html 在Posix Thread中定义有一套专门用于线程同步的mutex函数. . 创建和销毁 ...
- [Oracle] Redo&Undo梳理
Oracle Redo&undo Oracle中的redo和undo是关键技术的核心, 诸如实例恢复, 介质恢复, DataGuard, 闪回机制等都是给予redo和undo的, 所以很有必要 ...
- 2018年东北农业大学春季校赛 B wyh的矩阵【找规律】
链接:https://www.nowcoder.com/acm/contest/93/B来源:牛客网 题目描述 给你一个n*n矩阵,按照顺序填入1到n*n的数,例如n=5,该矩阵如下 1 2 3 4 ...
- Codeforces 754A Lesha and array splitting (搜索)
题目链接 Lesha and array splitting 设s[i][j]为序列i到j的和,当s[i][j]≠0时,即可从i跳到j+1.目标为从1跳到n+1,所以按照题意暴力即可. #includ ...
- Network | TCP
Transmission Control Protocol, TCP是一种面向连接的.可靠的.基于字节流的传输层通信协议. 应用层向TCP层发送用于网间传输的.用8位字节表示的数据流,然后TCP把数据 ...
- 转:一个经典例子让你彻彻底底理解java回调机制
一个经典例子让你彻彻底底理解java回调机制 转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273 ...
- my-> git使用笔记
要在本地新建分支test0227并切换到该分支,运行git checkoutout 并加上-b参数,如: git checkout -b test0227 这相当于执行下面这两条命令: git bra ...