【转】 Pro Android学习笔记(四三):Fragment(8):再谈Transaction和管理器
Transaction的一些操作
Transaction提供add()、hide()、show()、remove()等功能。下面我们利用这些功能通过fragment的隐藏和显示,为用户提供切换的效果。
public void showDetails(int index){
if(index <0)
index = 0;
//将所有书的简介都生成fragment,通过add()加入容器中
FragmentTransaction ft = getFragmentManager().beginTransaction();
if(details == null){
details = new DetailFragment[BooksInfo.TITLES.length];
for(int i = 0; i < details.length; i ++){
details[i]= DetailFragment.newInstance(i);
ft.add(R.id.details,details[i]); //或者使用add(id, fragment, tag),同时为fragment指定tag
}
}
//根据用户点击的书目序号,将相应的简介显示,而将其他简介隐藏。
for(int i = 0 ; i< details.length; i ++){
if(i == index)
ft.show(details[i]);
else
ft.hide(details[i]);
}
//任何fragment transaction处理后,都通过commit()进行确认。
ft.commit();
}
在之前的基础小例子中,使用了replace(),相当于执行了remove()和add()的操作。commit()是加入UI线程的执行操作。
再谈FragmentManager
FragmentManager是在activity中与fragment对象进行互操作的接口,在activity和fragment(已与activity关联attach)中可以通过getFragmentManager()获取。通过管理器,可以获得fragement transaction,根据id,tag等获取fragment。
我们可以通过管理器的dump()功能输出debug信息。或者使用getFragmentManager().enableDebugLogging(true);来提供相关的debug功能。
调用其他fragment的方法
FragmentManager管理与activity相关的所有fragment。如果在fragment A中要调用到Fragment B的某个方法,可以通过管理器找到其他fragment的对象,如下处理:
FragmentB fragOther = (FragmentB)getFragmentManager().findFragmentByTag(“b”);
fragOther.someMethod( … );
唤起activity
在fragment可以直接使用startActivity()和startActivityForResult()方法,以及回调函数onActivityResult()。
唤起fragment和相互通信
如果在fragment A中要唤起 fragment B,在FragmentA中处理如下:
FragmentB bFrag = new FragmentB();
bFrag.setTargetFragment(this, 0);
getFragmentManager()fm.beginTransaction().add(bFrag, "work").commit();
创建和通过transaction加入没有什么特别,关键是setTragetFragment(),这样在FragmentB中就可以获得FragmentA的对象,可调用FragmentA的方法,Fragment B的代码例子如下:
TextView tv = (TextView)getTargetFragment().getView().findViewById(R.id.text1);
tv.setText(“Set from the called fragment”);
一些其它
有时在应用中为了某种逻辑,使用没有view层级的,即不可视的fragment,用之存储一些信息,当activity或者fragment由于UI配置改变进行re-create时,提供帮助。
在基础小例子中,学习了Fragment类以及子类ListFragment,此外还有DialogFragment,PreferenceFragment和WebViewFragment。
本博文涉及的例子代码,可以在Pro Android学习:Fragment中下载。
相关链接: 我的Android开发相关文章
【转】 Pro Android学习笔记(四三):Fragment(8):再谈Transaction和管理器的更多相关文章
- 【转】Pro Android学习笔记(三十):Menu(1):了解Menu
目录(?)[-] 创建Menu MenuItem的属性itemId MenuItem的属性groupId MenuItem的属性orderId MenuItem的属性可选属性 Menu触发 onOpt ...
- 【转】Pro Android学习笔记(三):了解Android资源(上)
在Android开发中,资源包括文件或者值,它们和执行应用捆绑,无需在源代码中写死,因此我们可以改变或替换他们,而无需对应用重新编译. 了解资源构成 参考阅读Android学习笔记(三八):资源res ...
- 【转】 Pro Android学习笔记(三二):Menu(3):Context菜单
目录(?)[-] 什么是Context menu 注册View带有Context menu 填Context菜单内容 Context菜单点击触发 什么是Context menu 在桌面电脑,我们都很熟 ...
- Android学习笔记(十八)——再谈升级数据库
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 之前我们为了保证数据库中的表是最新的,只是简单地在 onUpgrade()方法中删除掉了当前所有的表,然后强制 ...
- 【转】 Pro Android学习笔记(三三):Menu(4):Alternative菜单
目录(?)[-] 什么是Alternative menu替代菜单 小例子说明 Alternative menu代码 关于Category和规范代码写法 关于flags 多个匹配的itemId等参数 什 ...
- 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版
目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...
- 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果
目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...
- 【转】 Pro Android学习笔记(七四):HTTP服务(8):使用后台线程AsyncTask
目录(?)[-] 5秒超时异常 AsyncTask 实现AsyncTask抽象类 对AsyncTask的调用 在哪里运行 其他重要method 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注 ...
- 【转】 Pro Android学习笔记(五六):配置变化
目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...
随机推荐
- 【python】-- 类的装饰器方法、特殊成员方法
装饰器方法 类的另外的特性,装饰器方法:静态方法(staticmethod).类方法(classmethod).属性方法(property) 一.静态方法 在方法名前加上@staticmethod装饰 ...
- [APIO2008]免费道路
[APIO2008]免费道路 BZOJ luogu 先把必须连的鹅卵石路连上,大于k条no solution 什么样的鹅卵石路(u,v)必须连?所有水泥路都连上仍然不能使u,v连通的必须连 补全到k条 ...
- Python中pymysql模块详解
安装 pip install pymysql 使用操作 执行SQL #!/usr/bin/env pytho # -*- coding:utf-8 -*- import pymysql # 创建连接 ...
- Redis通过PUBLISH / SUBSCRIBE 等命令实现了订阅与发布模式
# 切换目录 [root@localhost /]# cd /opt/redis-4.0.10 # 启动客户端 -p 指定端口 [root@localhost ~]# redis-cli -p 638 ...
- 我的Android进阶之旅------>Android系统设置默认来电铃声、闹钟铃声、通知铃声
首先了解Android系统本身提供的默认铃声文件,这些文件都放在 /system/media/audio 目录下. /system/media/audio/ringtones 系统来电铃声 / ...
- python cookbook第三版学习笔记十六:抽象基类
假设一个工程中有多个类,每个类都通过__init__来初始化参数.但是可能有很多高度重复且样式相同的__init__.为了减少代码.我们可以将初始化数据结构的步骤归纳到一个单独的__init__函数中 ...
- 如何使用Django实现用户登录验证
最初开始搞用户登录验证的时候感觉没什么难的,不就是增删改查中的查询数据库么,但是还是遇到许多小问题,而且感觉在查询数据库的时候,要把前端的数据一条一条的进行比对,会导致我的代码很丑,而且方式很不智,所 ...
- Web Service概念辨析
Web Service包含两个概念. 其一是Web Service标准体系,由SOAP.WSDL.UDDI三要素组成,是平台和语言无关的.在这个概念里和WCF做比较是错误的,因为前者是行业标准,后者是 ...
- || and && 理解
逻辑或(||): 只要第一个值的布尔值为false,那么永远返回第二个值. 逻辑或属于短路操作,第一个值为true时,不再操作第二个值,且返回第一个值. 逻辑与(&&): 只要第一个值 ...
- CentOS取消屏幕保护自动锁屏功能
CentOS系统在用户闲置一段时间(默认为5分钟)后,会启动屏幕保护程序(默认的屏保为黑屏),并要求重新输入密码才能回到原来的桌面. 设置屏幕保护:System -> Preferences - ...