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做布局,不同选项做切换,使用起 ...
随机推荐
- BZOJ 3897: Power
3897: Power Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 218 Solved: 83[Submit][Status][Discuss] ...
- 【BZOJ4542】大数(莫队)
题意:给定一个N位的由[0..9]组成的数字串和质数P,有M次不强制在线的询问,每次询问区间[l,r]中模P意义下为0的子串个数 N,M<=2e5,P<=1e10 思路:一次A,本来还以为 ...
- 【CF1043D】Mysterious Crime(贡献)
题意:给定m个人,每个人有n个数字且每个人的所有数字都是一个n的排列,求有多少种方案去掉某个前缀和后缀后m个人剩余的部分相等 m<=10,n<=1e5 思路:考虑极长的一段连续匹配的串,因 ...
- [LeetCode] 4Sum hash表
Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar ...
- Linux内核情景分析之消息队列
早期的Unix通信只有管道与信号,管道的缺点: 所载送的信息是无格式的字节流,不知道分界线在哪,也没通信规范,另外缺乏控制手段,比如保温优先级,管道机制的大小只有1页,管道很容易写满而读取没有及时,发 ...
- C#图解教程学习笔记——接口
一.接口概念接口是指定一组函数成员而不实现它们的引用类型.所以只能类和结构来实现接口. 二.声明接口1. 接口声明不能包含:数据成员.静态成员,只能包含以下类型的非静态成员函数:方法.属性.事件.索引 ...
- c# automapper 使用
一.最简单的用法 有两个类User和UserDto 1 public class User 2 { 3 public int Id { get; set; } 4 public string Name ...
- LeetCode OJ-- Recover Binary Search Tree ***@
https://oj.leetcode.com/problems/recover-binary-search-tree/ 一棵二叉搜索树,二叉搜索树的特征是,中根遍历的话,得到的序列是递增的 题目中, ...
- nodejs编写实例基础操作
学习视频地址 https://cnodejs.org/topic/5a72c66ace45d440451465c3 初始化项目 首先查看项目中是否有package.json 文件,如果有可执行np ...
- centos 7 mysql 离线安装教程
1. 解压下载的zip包,会发现有以下几个rpm包: MySQL-client-advanced-5.6.22-1.el7.x86_64.rpm MySQL-devel-advanced-5.6.22 ...