Android学习笔记(五)Fragment简介
Fragment是在Android 3.0 (API level 11)中引入的Activity的子模块。初衷是为了适应大屏幕的平板电脑,我们只需要使用Fragment对UI组件进行分组、模块化管理,就能很方便在运行过程中动态更新Activity的界面。Fragment必须被嵌入Activity中使用个,虽然也拥有自己的生命周期,但其生命周期手它所在的Activity的生命周期的控制。只有当该Activity处于活动状态时,我们才可以通过方法独立的操作Fragment。
一、Fragment的几个特性
· Fragment总是作为Activity界面的组成部分。Fragment可通过getActivity()方法获取所在的Activity,Activity可以调用FragmentManager的findFragmentById()或findFragmentByTag()方法获取Fragment。
· 在Activity运行时,可调用FragmentManager的add()、remove()、replace()方法动态的操作Fragment。
· 一个Activity可同时组合多个Fragment;一个Fragment也可被多个Activity复用。
· Fragment可以响应输入事件并有自己的生命周期,但其生命周期被所在的Activity的生命周期控制。
二、创建Fragment
创建Fragment需要继承Fragment基类或者Fragment的子类,Fragment子类有:DialogFragment、ListFragment、PreferenceFragment或者WebViewFragment。与Activity类似,创建Fragment都需要实现一些回调方法,如:onCreate()、onCreateView()、onStart()、onResume()、onPause()、onStop()等。
通常,我们在开发中会重写以下三个回调方法:
· onCreate():系统创建Fragment对象后回调该方法,初始化必要组件。
· onCreateView():当Fragment绘制界面组件时回调该方法。该方法必须返回一个View,该View就是Fragment所显示的View。
· onPause():离开Fragment时回调该方法。
//重写改方法,返回值View将作为Fragment显示的组件
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//加载fragment_main.xml布局文件
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
return rootView;
}
三、Fragment添加到Activity
创建好了Fragment只有加入到Activity才可以展示出来,将Fragment添加到Activity中有两种方法:
· 在布局文件中:使用<fragment.../>元素添加Fragment,android:name属性指定Fragment的实现类。
<LinearLayout 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:orientation="horizontal" >
<fragment
android:name="com.codingblock.myfragment.MyFragment"
android:id="@+id/myfragment"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>
</LinearLayout>
· 在Java:通过FragmentTransaction对象的add()方法来添加Fragment。
1 @SuppressLint("NewApi")
2 @Override
3 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
     //加载容器
     setContentView(R.layout.activity_main);
     //添加Fragment
     getFragmentManager().beginTransaction().add(R.id.container, new MyFragment()).commit();
9 }
其中activity_main.xml布局文件如下:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.codingblock.myfragment.MainActivity"
tools:ignore="MergeRootFrame" />
提示:Activity的getFragmentManager()方法可以返回FragmentManager,FragmentManager对象的beginTransaction()方法即可开启并返回FragmentTransaction对象。
四、Fragment与Activity通信
1、将Fragment添加到activity之后,Fragment和Activity必须还有交互信息,这就需要Fragment能获取它所在的Activity,Activity也能获取它所包含的任意的Fragment。
· Fragment获取它所在的Activity:调用Fragment的getActivity()方法即可返回它所在的Activity。
· Activity 获取它包含的Fragment:调用Activity关联的FragmentManager的findFragmentById(int id)或findFragmentByTag(String tag)方法即可获取指定的Fragment。
提示:在布局文件中用<fragment../>元素添加Fragment时,可以指定andorid:id或android:tag属性,用于标识该Fragment。
2、另外,Fragment与Activity还需要相互传递数据:
· Activity向Fragment传递数据:在Activity中创建Bundle数据包,并调用Fragment的setArguments(Bundle bundle)方法可将Bundle数据包传给Fragment。
· Fragment想Activity传递数据或Activity需要在fragment运行中进行实时通信:在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity实现该回调接口。
五、Fragment管理与Fragment事务
Activity管理Fragment主要依靠FragmentManager,通过FragmentManager可以完成以下几个功能:
· 使用findFragmentById()或findFragmentByTag()获取指定的Fragment。
· 调用popBackStack()将Fragment从后台栈中弹出(模拟BACK键)。
· 调用addOnBackStackChangeListener()注册一个监听器,用于监听后台栈的变化。
另外,可以借助FragmentTransaction对象进行添加、删除、替换Fragment,FragmentTransaction代表Activity对Fragment的执行的多个改变。
可以分以下几步实现管理fragment:
1 // 1、打开事务 获得FragmentTransaction
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// 2、创建一个新的Fragment
5 Fragment fragment = new MyFragment();
6 // 3、替换container容器内的fragment
7 fragmentTransaction.replace(R.id.container, fragment);
8 // 4、将事务添加到back栈,允许用户按下back键后返回到上一个状态
9 fragmentTransaction.addToBackStack(null);
10 // 5、提交事务
11 fragmentTransaction.commit();
本篇博文仅介绍了Fragment的简单用法,在后续博文中将接着更深入的探讨Fragment。
Android学习笔记(五)Fragment简介的更多相关文章
- android学习笔记五——AutoCompleteTextView
		
AutocompleteTextview ==> 使用比较容易,只需要为其设置一个Adapter,该Adapter封装其需要预设的文本内容. 如下所示实例: <RelativeLayout ...
 - android学习笔记五
		
Android中的category大全 Api Level 3(SDK 1.5)和Api Level 4(SDK 1.6): android.intent.category.ALTERNATIVE a ...
 - Android学习笔记五:四大组件(转)
		
转自:http://blog.csdn.net/shenggaofei/article/details/52450668 Android四大组件分别为activity.service.content ...
 - android学习笔记五。2、其他组件
		
一.ContentProvider内容提供者.是是android中一个应用向第三方共享数据的方式,android中的联系人,sms(短信记录)等都是通过这一方式来向外提供的 1.使用: 在应用中使用C ...
 - android学习笔记五。1、Service深入学习
		
一.Service,服务是没有界面而在后台长期运行的程序,可以看做是后台的Activity. 1.在Android中按返回键退出一个应用并不会(内存充足时)直接销毁一个进程,所以其中的子线程也可以在后 ...
 - 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版
		
目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...
 - 【转】 Pro Android学习笔记(五六):配置变化
		
目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...
 - 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果
		
目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...
 - 【转】 Pro Android学习笔记(七五):HTTP服务(9):DownloadManager
		
目录(?)[-] 小例子 保存在哪里下载文件信息设置和读取 查看下载状态和取消下载 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csd ...
 - 【转】 Pro Android学习笔记(五七):Preferences(1):ListPreference
		
目录(?)[-] 例子1ListPreference小例子 定义一个preferences XML文件 继承PreferenceActivity 用户定制偏好的读取 第一次运行时设置缺省值 设置Cat ...
 
随机推荐
- Visual Studio 2013 RTM 中文语言包官方下载地址发布
			
如果你下载的是英文版,你想安装一个中文的visual studio 2013,那么你大可不必重新下载安装visual studio 2013,因为微软提供了Visual Studio 2013 RTM ...
 - AngularJs的UI组件ui-Bootstrap-Tooltip
			
完整案例,参考http://www.cnblogs.com/pilixiami/p/5661600.html <!DOCTYPE html> <html ng-app="u ...
 - Java SE   Java EE   Java ME 的区别
			
Java SE(Java Platform,Standard Edition) Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Java 应用程序.J ...
 - storm简介[ZZ]
			
场景 伴随着信息科技日新月异的发展,信息呈现出爆发式的膨胀,人们获取信息的途径也更加多样.更加便捷,同时对于信息的时效性要求也越来越高.举个搜索 场景中的例子,当一个卖家发布了一条宝贝信息时,他希望的 ...
 - yarn源代码
			
Modules-------YARN consists of multiple modules. The modules are listed below as per the directory s ...
 - 从用python自动生成.h的头文件集合和类声明集合到用python读写文件
			
最近在用python自动生成c++的类.因为这些类会根据需求不同产生不同的类,所以需要用python自动生成.由于会产生大量的类,而且这些类是变化的.所以如果是在某个.h中要用include来加载这些 ...
 - ubuntu修改主机名称
			
一.为何要修改主机名称 在安装Ubuntu时,一不小心主机名称输入的“too long”了,导致命令行上就提示符占据了一行的1/3,迫使我产生修改主机名称的冲动. 二.操作方法 原理:系统启动时,会从 ...
 - java相关各种页面跳转
			
AK相信页面跳转在这个圈圈圆圆里是个地球人都能经常遇到的事,AK也在平时的工作学习中记录了一些,这里就做一个小小的总结,有任何的疑问和质疑都希望您能告诉我,不用担心后果,必定至少您还能理我,AK万分感 ...
 - HashMap遍历,推荐使用entrySet()
			
之前map遍历,偶尔会先去keyset然后再遍历keyset 比如 Map map = new HashMap(); Iterator it = map.keySet().iterator(); wh ...
 - 我的iphone6退货之路
			
开篇 匆匆这一年又快结束了,眼看年关将近,老婆的生日也快到了,正打算给老婆买个礼物,由于现在老婆用的手机是公司的工程机,而且还是低端产品,所以一直想给老婆改善改善,也算是对老婆这一年来辛苦的默默的支持 ...