Android Fragment的使用
定义
Fragment可以理解成一个迷你型的活动,同样可以包含布局,同样有自己的生命周期。比Activity要轻量级,在程序内部做界面跳转要比Activity快的多。
静态添加
Fragment可以静态或者动态的添加到Activity中,其中静态情况下,直接在layout.xml中添加fragment节点,并指定android:name属性就可以启动相应的fragment.
动态添加
可以在Activity中通过覆盖onCreate()函数来动态添加Fragment
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null){
getSupportFragmentManager().beginTransaction().add(R.id.container, new MainFragment()).commit();
}
}
动态替换:
在Fragment中可以通过添加按钮事件接收器覆盖当前的fragment:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.fragment_main, container, false); rootView.findViewById(R.id.btnShowAnotherFragment).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getFragmentManager().beginTransaction()
.addToBackStack(null)
.replace(R.id.container, new AnotherFragment())
.commit();
}
});
注意,一个静态添加的Fragment,通过这种动态的方法进行替换会造成两个Fragment在Framelayout中的重叠。
生命周期:
当一个B Fragment被另一个A fragment启动的时候会执行B oncreate, A onPause, A onDestroyView,B oncreateview
这个A Fragment并不会执行A onDestroy。
当按Back键返回时会执行B onPause, B onDestroyView, B onDestroy销毁, A onCreateView。
碎片与活动的通信
关于这个问题有一片文章总结的比较好:Android:Activity与Fragment通信(99%)完美解决方案
要想在活动中得到碎片的实例,需要调用FragmentManager的findFragmentById()函数,反过来如果想在碎片中得到活动的实例需要调用getActivity()函数。
如果fragment需要调用activity的函数,则需要保存activity的实例,并定义一个接口,让activity去实现,这样就可以通过fragment保存的实例去调用了。这样做的主要问题是耦合太多,如果activity改变,比如被删除了,那么fragment的代码也需要被更改。
解决方法
定义一个baseFragment类,在其中保存 一个baseActivity类的实例。baseActivity的功能是有一个回调函数可以在baseFragment被onAttach的时候调用,这个函数会将所有的会被fragment调用的函数添加到一个HashMap中,只要在Activity中实现了这个接口,就可以保证在onAttach的时候被添加进来。添加机制定义好之后,只要在我们要定义的activity中实现这个接口,那么就一定会被包含在我们的HashMap中,以供调用。 一个Functions实例。Functions实例就是我们保存HashMap的地方。 当调用的时候,会直接取得这个实例并进行调用。 至此,Activity通过固定的接口进行添加接口函数以供fragment调用,当添加删除Activity的时候Fragment完全不需要改动,当这个fragment被attach到哪一个activity的时候它所能进行的调用就都由Activty侧定义了,fragment要做的就是发起调用,说白了就是以 固定的方式进行activity和fragment之间的函数调用,没啥意思。
其他
当一个Activity执行onPause()的时候,这个Activity中所有的Fragment都会执行onPause() 当一个Fragment被作为layout的Item添加进来的时候,是不可以被删除的 所有的Fragment之间的通信都是靠Activity,两个Fragment之间不能直接通信。
Android Fragment的使用的更多相关文章
- 【Android自学日记】【转】Android Fragment 真正的完全解析(下)
上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和各种API,如果你还不了解,请看:Android Fragment 真正的完全解析(上). 本篇将介绍上篇博客提到的:如何管理Frag ...
- Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
Toolbar作为ActionBar使用介绍 本文介绍了在Android中将Toolbar作为ActionBar使用的方法. 并且介绍了在Fragment和嵌套Fragment中使用Toolbar作为 ...
- Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复
Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...
- Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常见错误
嵌套Fragment的使用及常见错误 嵌套Fragments (Nested Fragments), 是在Fragment内部又添加Fragment. 使用时, 主要要依靠宿主Fragment的 ge ...
- Android Fragment使用(一) 基础篇 温故知新
Fragment使用的基本知识点总结, 包括Fragment的添加, 参数传递和通信, 生命周期和各种操作. Fragment使用基础 Fragment添加 方法一: 布局里的标签 标识符: tag, ...
- Android Fragment应用实战
现在Fragment的应用真的是越来越广泛了,之前Android在3.0版本加入Fragment的时候,主要是为了解决Android Pad屏幕比较大,空间不能充分利用的问题,但现在即使只是在手机上, ...
- Android Fragment 真正的完全解析(下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和 ...
- Android Fragment
1.Fragment必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期. 2.Fragment 生命周期: 首页 最新文章 在线课程 业界 开发 ...
- Android Fragment应用实战,使用碎片向ActivityGroup说再见
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/13171191 现在Fragment的应用真的是越来越广泛了,之前Android在3 ...
- Android Fragment完全解析
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8881711 我们都知道,Android上的界面展示都是通过Activity实现的, ...
随机推荐
- css伪类的展现
常见的伪类选择器 :link :hover :active :visited 如果为以上几个伪类赋予相同css属性名,不同的css属性值 <!DOCTYPE html> <html ...
- 微信小程序-表单组件
button 按钮 注:button-hover 默认为{background-color: rgba(0, 0, 0, 0.1); opacity: 0.7;} 示例代码: /** wxss **/ ...
- Javascript是单线程的深入分析
本来想总结一下的,网上却发现有人已经解释的很清楚了,特转过来. 这也解释了为什么在用自动化测试工具来运行dumrendtree时设定的超时和测试case设定的超时的关联性. 面试的时候发现99%的童鞋 ...
- Maven 配置 Selenium + testNG + reportNG 运行环境
.markdown-preview:not([data-use-github-style]) { padding: 2em; font-size: 1.2em; color: rgb(56, 58, ...
- char.js
轻量级前端画图js框架 此文档包含了用Chart.js创建漂亮图表的所有知识. http://www.bootcss.com/p/chart.js/docs/ 中文文档
- (原创)vim配色------水果色,不伤眼。
- Php中的强制转换详解
强制转换中分为两种,第一种就只临时转换,和永久转换.在临时转换中呢,首先可以通过第一中方式来显示,就是小括号的形式,临时转换成整型我们可以通过(int)都是这样的形式,或者是(integer)临时转换 ...
- 配置sublime text 3 的Python开发环境
为了在sublime实现像Python自带idle一样的F5交互功能: 首先安装package control然后install Sublime REPL:然后配置 Preference-->P ...
- 不在折腾---hive-0.13.1-bin
Hive只在一个节点安装即可 上传tar包 解压 > tar zxvf hive-0.13.1-bin.tar.gz 配置mysql * 检查MySQL是否安装:rpm -qa | grep m ...
- 无法启动xwindow
1 新建一个lqx用户,执行startx命令出现: Fatal server error: PAM authentication failed, cannot start X server. perh ...