Fragments 概念是在Android3.0版本就已经有了,3.0版本是Tab(平板)专用,后来在4.0以上的版本继续沿
用Fragments,改善了Activity的灵活性。
在没有Fragments之前,一个屏幕就只能放一个Activity,有了Fragments之后,一个屏幕也只能放一个Anticity,但Activity里可以包含多个Fragments,Fragments因此也被成为子Activity,但是Fragments不是Activity的subClass,Fragments直属Object子类。
下面例子一个Activity包含两个Fragments 左边一个现实Title 右边一个现实相应的content。
Fragments 必须寄生在Activity里面,不能脱离Activity而存在,与Activity一样,Fragments同样具有自己的生命周期,其生命周期比Activity更复杂,但是Fragments的生命周期受Activity影响,随着Activity结束而结束。
1.onAttach(Activity) 在Fragments和Activity关联时候回调,可以进行一些限制条件的判定。
2. onCreate(Bundle) 和Activity一样
3. onCreateView(LayoutInflater, ViewGroup, Bundle) View在这里初始化,并返回给Fragments
4. onActivityCreated(Bundle) 在Activity.onCreate().也就是Activity初始化后,会会掉Fragments这个函数
5. onStart()
6. onResume()
1. onPause()
2. onStop()
4. onDestroy()
5. onDetach()
Demo示例:
主Activity
package com.example.fragmenttest; import com.example.fragmenttest.FragmentTitle.OnTtileClickListener; import android.os.Bundle; import android.app.Activity; import android.app.FragmentTransaction; import android.database.sqlite.SQLiteDatabase; import android.view.Menu; /** * 主Activity * @author ccf * */ public class MainActivity extends Activity implements OnTtileClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public void onTtitleClick(String content) { FragmentContent content2 = FragmentContent.getInstance(content); getFragmentManager().beginTransaction() .replace(R.id.mContent, content2).commit(); } @Override public void onBackPressed() { // TODO Auto-generated method stub super.onBackPressed(); } }
XML布局文件
<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" > <fragment class="com.example.fragmenttest.FragmentTitle" android:id="@+id/titleList" android:layout_width="0dip" android:layout_height="fill_parent" android:layout_weight="1" /> <FrameLayout android:id="@+id/mContent" android:layout_width="0dip" android:layout_height="fill_parent" android:layout_weight="2" /> </LinearLayout>
fragment 只是一个占位符,class属性,标志该占位符代表哪个Fragments.
FrameLayout 作为父容器,放用来置Fragments。
FragmentTitle Activity左边的Title列表,继承了ListFragment。 ,ListFragment持有一个ListView
package com.example.fragmenttest; import android.annotation.SuppressLint; import android.app.FragmentTransaction; import android.app.ListFragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ListView; @SuppressLint("NewApi") public class FragmentTitle extends ListFragment { private final static String title[] = { "龙骑士", "死灵骑士", "死神来了", "第一滴血" }; private final static String content[] = { " 曾经和平富饶的国度阿拉盖西亚,如今陷在邪恶国王(约翰·马尔科维奇 John Malkovich 饰)的暴政统治下,期待神灵解救敢怒不敢言的人民。一日,农家少年伊拉贡(艾德·斯皮尔斯 Ed Speleers 饰)在林中拾获一枚奇石,不想竟是一枚龙卵,孵出一只蓝色飞龙。伊拉贡为小龙取名“萨菲拉”,遇到先知布鲁姆(杰瑞米·艾恩斯 Jeremy Irons 饰)后,才明白这是一场怎样的机缘——曾经守护这片土地的龙骑士应该回来了,带领人民找回自由。在布鲁姆的指导下,伊拉贡开始学习剑术和驭龙技巧,慢慢从一个普通少年成长为担当重任的龙骑士,前路危险重重,前路通向光明…… ", "莫罗(伊德瑞斯·艾尔巴 Idris Elba 饰)请求布雷斯把小孩丹尼带来神殿以避免恶魔夺取他的灵魂,作为回报他将驱除布雷斯身上的诅咒。丹尼是魔鬼罗尔科的儿子,罗尔科为了把自己的魔力植入儿子体内正派卡里跟追踪逃跑途中的母子两人。正当母子俩被困在采石场的时候,布雷斯到来,他体内的天使爆发了出来,压制住了卡里根。他变成了恶灵骑士,毫不手软的把对手撕成碎片。当战争结束时,三人前往神殿,同时,罗尔科也救醒了死亡边缘的卡里根,并赋予他更可怕的摧毁力,让他再去把丹尼找回来。 在神殿里,莫罗履行协议把布雷斯体内的扎萨罗斯驱赶了出来。但正当他做法时,神殿的牧师试图杀死丹尼——他认为丹尼就是恶魔。还没等他们行动,卡里根就到了。把丹尼带去见了", "某公司组织一次远游,虽然员工们各怀心事,不过他们还是踏上了欢乐的旅途。在经过一座巨大的吊桥时,年轻人山姆(Nicholas D'Agosto 饰)突然看到幻象,幻象中大桥开始垮塌,包括他、同事、朋友在内无数人在这起事故中遇难。当他从幻象中醒来时,周边的种种迹象表明那场灾难即将到来。慌乱之中,他和朱莉(艾玛·贝尔 Emma Bell 饰)、皮特(Miles Fisher 饰)、坎蒂丝(Ellen Wroe 饰)、奥利维亚(Jacqueline MacInnes Wood 饰)等8个人下了车。灾难随即发生,山姆等人成为车上仅有的幸存者。 但是命运并未偏袒这几名幸运儿,死神仍时刻逡巡在他们的周围。死神来了,无论逃到天涯海角也没有用…", " 退伍军人兰博(西尔维斯特•史泰龙Sylvester Stallone 饰)从越南回国,他回到已显得陌生的原居小镇,当地警长(布莱恩•丹内利 Brian Dennehy 饰)看到这个退伍军人的第一眼起,就开始对兰博百般挑剔,甚至将他带回警局肆意侮辱,不堪忍受责打的兰博袭警之后逃跑。警长召集大批警察展开对兰博的追捕,兰博逃至荒山野林之中,不断用自己在越战中掌握的游击战术对警察展开反击,他了一辆武器运输车返回小镇烧毁了商店,法律和武器都不能阻止兰博了。兰博在越战时的长官上校(理查德•克里纳 Richard Crenna 饰)出现,劝说兰博放下枪械,愤懑已久的兰博吼出了自己的困惑与不甘…… " }; @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); getListView().setBackgroundColor( getResources().getColor(android.R.color.darker_gray)); setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, title)); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return super.onCreateView(inflater, container, savedInstanceState); } @Override public void onListItemClick(ListView l, View v, int position, long id) { // TODO Auto-generated method stub super.onListItemClick(l, v, position, id); OnTtileClickListener listener = (OnTtileClickListener) (getActivity()); listener.onTtitleClick(content[position]); } @Override public void onPause() { super.onPause(); } public interface OnTtileClickListener { public void onTtitleClick(String content); } }
FragmentContent是右边详细内容显示区域。
package com.example.fragmenttest; import android.annotation.SuppressLint; import android.app.Fragment; import android.app.ListFragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ListView; import android.widget.ScrollView; import android.widget.TextView; @SuppressLint("NewApi") public class FragmentContent extends Fragment { private String strContent; public static FragmentContent getInstance(String strContent) { FragmentContent content = new FragmentContent(); content.strContent = strContent; return content; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); ScrollView scrollView = new ScrollView(getActivity()); TextView mTextView = new TextView(getActivity()); mTextView.setPadding(5, 5, 5, 5); mTextView.setTextSize(15); mTextView.setText(strContent); scrollView.addView(mTextView); scrollView.setBackgroundColor(getResources().getColor(android.R.color.holo_blue_light)); return scrollView; } @Override public void onPause() { // TODO Auto-generated method stub super.onPause(); } }
MainActivity类很简单。 onCreate(Bundle savedInstanceState)函数只是简单调用setContentView().,加上实现了FragmentTitle 中自定义的 OnTitleClickListener接口外,并未做什么其他初始化,FragmentTitle的初始化是在他自己的 onActivityCreated(Bundle savedInstanceState) 中进行的。
当Activity 调用onCreate()后,就会调用FragmentTitle onActivityCreated(Bundle savedInstanceState) 来完成左边标题列表的初始化。
@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); getListView().setBackgroundColor( getResources().getColor(android.R.color.darker_gray));//设置背景颜色 setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, title));//调用该方法初始化列表 }
mainActivity 实现FragmentTitle 中自定义的 OnTitleClickListener 接口,FragmentTitle就可以可以在
onListItemClick(ListView l, View v, int position, long id)
@Override public void onTitleClick(String content) { FragmentContent content2 = FragmentContent.getInstance(content); getFragmentManager().beginTransaction() .replace(R.id.mContent, content2).commit(); }
@Override public void onListItemClick(ListView l, View v, int position, long id) { // TODO Auto-generated method stub super.onListItemClick(l, v, position, id); OnTitleClickListener listener = (OnTitleClickListener) (getActivity()); listener.onTitleClick(content[position]); }
如何对Activity中的Fragment进行操作呢?
在onTitleClick(String content)回调函数中,调用getFragmentManager()函数,获取FragmentManager实例,再通过FragmentManager 的beginTransaction()函数获得FragmentTransaction实例。
利用FragmentTransaction实例 就可以对Fragments实例进行操作,有以下几个基本操作
add() 把Fragments实例和Activity关联起来
hide() 把Activity中存在的Fragments影藏起来,对应盈利个函数show() 把已经被影藏的Fragments显示出来
remove() 把Activity中的Fragments移除掉。
replace() 用指定Fragments的替换另一个Fragments 相当于remove()+add()
commit() 以上操作并需经过commit() 条件该transaction(事务)后才生效。
当
Fragments和Activity之间的通讯:
1.在Activity中可以通过FragmentManager 两个方式获取到相应的Fragments
findFragmentById(int id) 通过xml布局文件中注册的id获取该实例,这种Fragments必须在布局文件正声明其id
findFragmentByTag(String tag) 通过tag找到实例 ,tag是改Fragments实例在被 FragmentTransaction#add(int containerViewId, Fragment fragment, String tag) 作为最后一个参数传入,tag要保持其唯一性,因为他是对应Fragments实例的唯一标识。
2. Fragments中可以通过getActivity()获取到对应的Activity实例
相关推荐
《Android Support Library v4详解》 在Android应用开发中,Android Support Library v4是一个至关重要的组件,它提供了对Android API Level 4及更高版本的向下兼容性,使得开发者可以使用最新的API特性,同时确保...
本文档主要讲述的是android-fragment详解使用; 自从Android 3.0中引入fragments 的概念,根据词海的翻译可以译为:碎片、片段。其上的是为了解决不同屏幕分辩率的动态和灵活UI设计。大屏幕如平板小屏幕如手机,平板...
《Android Support Library v4详解》 在Android应用开发中,Android Support Library v4是一个至关重要的组件,它提供了对Android API Level 4及更高版本的向下兼容性,使得开发者可以使用最新的API特性,同时保证...
**Android Support Library v4详解** Android Support Library v4,简称support-v4,是Google为Android开发者提供的一款重要的库,它的存在使得开发者能够为更广泛的Android设备提供兼容性服务,包括那些运行旧版本...
`android-support-v4.jar`库包含了大量适用于所有API级别的类和方法,它能够帮助开发者在低版本的Android系统上实现高级功能,如碎片(Fragments)、Loader、BroadcastReceiver等。由于早期的Android设备碎片化严重,...
《Android Support Library v13详解》 Android Support Library v13是Google为Android开发者提供的一套重要的库,它旨在帮助开发者实现对早期Android版本的兼容性,同时也包含了一些额外的功能和改进。这个库的核心...
【Android自动滚动ViewPager详解】 在Android开发中,ViewPager是一个常用组件,它允许用户左右滑动来查看多个页面。而“android-auto-scroll-view-pager-master”项目则是在此基础上进行了扩展,实现了自动滚动的...
**Android SDK 2.2-4.4 知识点详解** Android SDK(Software Development Kit)是用于开发Android应用程序的工具集,包含了开发者构建、测试和调试应用所需的各种组件。从2.2(API Level 8,Froyo)到4.4(API ...
【Android APP开发入门详解】 Android应用开发是移动开发领域中的一个重要组成部分,对于初学者来说,了解并掌握Android开发的基本流程至关重要。本教程将带你逐步走进Android APP开发的世界,从环境配置到编写代码...
### Fragments游戏框架详解 #### 一、Fragments 概述 在开发Android应用时,开发者经常需要构建灵活且可重用的用户界面组件。为了适应不同屏幕尺寸和分辨率的设备,Google在Android 3.0 (Honeycomb) 中引入了`...
**Android ViewPager 使用详解** ViewPager是Android开发中一个非常重要的组件,它允许用户通过左右滑动来切换不同的页面,常用于实现应用的滑动导航或展示多个相似内容的页面。在本篇文章中,我们将深入探讨...
【Android基础:构建基本模块详解】 在Android开发领域,掌握基础是至关重要的。"android-basic:Android课程-基本模块"这个项目旨在引导开发者逐步理解并建立Android应用的基础框架。在这个项目中,我们将深入探讨...
### Android 3.0 SDK中新增API详解 #### 一、引言 随着技术的不断发展,Android系统也在不断地更新和完善自身。从Android 1.0到Android 3.0(代号Honeycomb),每一次版本迭代都带来了诸多新功能与改进。其中,...
包括:android gravity 和 android layout_Gravity,Bundle,ContentResolver,cursor,Fragments ,Fragments,inflater ,Fragment,数据查询query函数参数解析, 【Cursor】 类的介绍,android 获得通话记录,Handler ,...
### Android开发入门知识点详解 #### 一、核心概念(Part I: Core Concepts) **1.1 大局观(Chapter 1: The Big Picture)** - **知识点:** - Android平台简介 - Android应用架构 - 应用组件(Activity、...
《Android ActionBar详解》 Action Bar是Android开发中的一个重要组件,它是自Android 3.0 (API级别11)引入的,旨在提供一个统一且适应性强的界面,用于展示应用程序标识、用户位置,以及提供关键操作和导航。在...
- Intent机制详解。 4. **第4章:Building User Interfaces** - XML布局文件的创建和使用。 - 各种UI组件的属性和方法介绍。 - 自定义View的实现技巧。 5. **第5章:Intents and Broadcast Receivers** - ...
《Android官方Training实例详解》 Android官方Training实例是Android开发者学习和进阶的重要资源,它由谷歌官方提供,旨在帮助开发者深入理解Android平台的各种功能和最佳实践。这些实例覆盖了从基础到高级的各种...
### Android 4.0 ActionBar API 知识点详解 #### 一、ActionBar 概述 ActionBar 是 Android 4.0 (API 级别 14) 引入的一个新特性,它替代了传统的标题栏 (title bar),并提供了一个更丰富、更灵活的界面控件,用于...