Android Fragment和Activity的交互介绍
Fragment和Activity的交互
一个Fragment的实例总是和包括它的Activity直接相关。
fragment能够通过getActivity() 方法来获得Activity的实例。然后就能够调用一些比如findViewById()之类的方法。
如:
View listView = getActivity().findViewById(R.id.list);
可是注意调用getActivity()时,fragment必须和activity关联(attached to an activity)。否则将会返回一个null。
相似的,activity也能够获得一个fragment的引用。从而调用fragment中的方法。
获得fragment的引用要用FragmentManager。之后能够调用findFragmentById() 或者 findFragmentByTag().
比方:
ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
创建事件回调
一些情况下,可能须要fragment和activity共享事件,一个比較好的做法是在fragment里面定义一个回调接口。然后要求宿主activity实现它。
当activity通过这个接口接收到一个回调,它能够同布局中的其它fragment分享这个信息。
比如,一个新闻显示应用在一个activity中有两个fragment,一个fragment A显示文章题目的列表,一个fragment B显示文章。
所以当一个文章被选择的时候,fragment A必须通知activity,然后activity通知fragment B,让它显示这篇文章。
这个情况下,在fragment A中声明一个这种接口OnArticleSelectedListener:

public static class FragmentA extends ListFragment {
...
// Container Activity must implement this interface
public interface OnArticleSelectedListener {
public void onArticleSelected(Uri articleUri);
}
...
}

之后包括这个fragment的activity实现这个OnArticleSelectedListener接口。用覆写的onArticleSelected()方法将fragment A中发生的事通知fragment B。
为了确保宿主activity实现这个接口。fragment A的onAttach() 方法(这种方法在fragment
被增加到activity中时由系统调用)中通过将传入的activity强制类型转换。实例化一个OnArticleSelectedListener对象:

public static class FragmentA extends ListFragment {
OnArticleSelectedListener mListener;
...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnArticleSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
}
}
...
}

假设activity没有实现这个接口。fragment将会抛出ClassCastException异常,假设成功了,mListener将会是activity实现OnArticleSelectedListener接口的一个引用。所以通过调用OnArticleSelectedListener接口的方法,fragment
A能够和activity共享事件。
比方。假设fragment A是ListFragment的子类,每一次用户点击一个列表项目,系统调用fragment中的onListItemClick() 方法,在这种方法中能够调用onArticleSelected()方法与activity共享事件。

public static class FragmentA extends ListFragment {
OnArticleSelectedListener mListener;
...
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// Append the clicked item's row ID with the content provider Uri
Uri noteUri = ContentUris.withAppendedId(ArticleColumns.CONTENT_URI, id);
// Send the event and Uri to the host activity
mListener.onArticleSelected(noteUri);
}
...
}

处理Fragment的生命周期
三种停留状态
管理fragment的生命周期和管理activity的生命周期类似,和activity一样。fragment能够在三种状态下停留:
Resumed
fragment在running的activity中可见。
Paused
还有一个activity在前景执行,而且享有焦点,可是这个fragment所在的activity仍然可见(前景activity部分遮挡或者是半透明的)。
Stopped
fragment不可见。
可能是由于宿主activity处于stopped状态。或者fragment被remove掉,然后加在了back stack中。
一个处于stopped状态的activity还是存活状态的,全部的状态和成员信息会被系统保持。可是。它不再被用户可见。而且假设宿主activity被kill掉,它也会被kill掉。
数据存储和恢复
和Activity类似,能够用Bundle类对象保存fragment的状态。当activity的进程被kill之后,须要重建activity时,能够用于恢复fragment的状态。
存储时利用onSaveInstanceState()回调函数,恢复时是在 onCreate(), onCreateView(),
或者onActivityCreated()里。
Back Stack
activity和fragment生命周期最重要的不同之处是它们怎样存储在各自的back stack中。
Activity停止时,是存在一个由系统维护的back stack中。可是当fragment停止(被remove)时。须要程序猿显示地调用addToBackStack() ,而且fragment是存在一个由宿主activity掌管的back
stack中。
Fragment和Activity的生命周期
宿主activity的声明周期直接影响到fragment的生命周期,比方activity生命周期的回调函数调用时,全部在当中的fragment的同样的回调函数会同一时候被调用。
Fragment另一些额外的生命周期回调函数:
当fragment和activity被关联时调用。
当创建fragment的UI被初始化时调用。
当activity的onCreate()方法返回时调用。
当fragment的UI被移除的时候调用。
当fragment和activity去关联时调用。
如图:

从这个图上能够看出activity的状态决定了fragment可能接收到的回调函数。
比方说。当activity接收到它的onCreate()回调函数,那么这个activity中的fragment最多接收到了onActivityCreated()。
当activity处于Resumed状态时,能够自由地加入和移除fragment,也即是说。仅仅有activity在Resumed状态时,fragment的状态能够独立改变。
可是,当activity离开Resumed状态,fragment的生命周期被activity控制。
Android Fragment和Activity的交互介绍的更多相关文章
- Android Fragment与Activity交互的几种方式
这里我不再详细介绍那写比较常规的方式,例如静态变量,静态方法,持久化,application全局变量,收发广播等等. 首先我们来介绍使用Handler来实现Fragment与Activity 的交互. ...
- android Fragment与Activity交互,互相发数据(附图具体解释)
笔者最近看官方training.发现了非常多实用又好玩的知识. 当中.fragment与Activity通信就是一个. fragment与Activity通信主要是两点: 1.fragment传递信息 ...
- Android Fragment与Activity之间的数据交换(Fragment从Activity获取数据)
Fragment与Activity之间的数据交换,通常含有3: 一.Fragment从Activity获取数据(仅本文介绍了一个第一): 两.Activity从Fragment获取数据: 三.Frag ...
- Android Fragment与Activity通讯详解
与activity通讯 尽管fragment的实现是独立于activity的,可以被用于多个activity,但是每个activity所包含的是同一个fragment的不同的实例. Fragment可 ...
- Android—Service与Activity的交互
service-Android的四大组件之一.人称"后台服务"指其本身的运行并不依赖于用户可视的UI界面 实际开发中我们经常需要service和activity之间可以相互传递数据 ...
- Android Service与Activity的交互
Android中有时候需要在Service中改变Activity的UI,或者在Activity中修改Service中的数值.首先必须使用与Activity绑定的Service,有三种方式可以实现.第一 ...
- Android fragment 想activity 传送数据
fragment可以通过定义 fragment的接口的方法来 想activity传送数据: 而activity则是通过实现 fragment的接口来接收fragment的送来的数据: 1.在fragm ...
- 深入分析:Fragment与Activity交互的几种方式(一,使用Handler)
这里我不再详细介绍那写比较常规的方式,例如静态变量,静态方法,持久化,application全局变量,收发广播等等. 首先我们来介绍使用Handler来实现Fragment与Activity 的交互. ...
- Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
随机推荐
- 消息队列 (1) mac安装RabbitMQ
什么是RabbitMQ? RabbitMQ是由Erlang语言编写的实现了高级消息队列协议(AMQP)的开源消息代理软件(也称为面向消息的中间件).支持WIndows.Linux.MAC OS 操作系 ...
- [ NOIP 2008 ] TG
\(\\\) \(\#A\) \(Word\) 给出一个长为\(N\)的小写字母串,判断出现所有字母中最多出现次数减最少出现次数得到的答案是否是质数. \(N\in [1,100]\) 直接按题意开桶 ...
- 背包系列 hdu3449 有依赖背包
这道题真正困扰了笔者3,4天,冥思苦想几日无果之后,只能去找大牛的解法.结合网上的大牛解法与自己的理解,笔者终于解决了这个坑了,在此小庆幸一下. 原题如下: Consumer Time Limit: ...
- C#——设置开机启动
将exe应用程序设置为开机启动,有多种方法,我们主要通过注册表设置开机启动选项. using Microsoft.Win32; using System.Windows.Forms; static v ...
- 详解HashMap数据结构实现
HashMap的设计是由数组加链表的符合数据结构,在这里用自己的语言以及结合源码去总结一下,如果有不对的地方希望评论指正,先拱手谢谢. HashMap是日常中非常常用的一种数据结构,我们要想深入了解学 ...
- mounted钩子问题
recommend.vue <script type="text/ecmascript-6"> import Slider from 'base/slider/slid ...
- PAC代理语法含义与书写规范
一直以来使用ShadowSocksFQ,基本上默认的PAC代理模式己能满足所需,实在个别pac不方便的就转成用全局代理模式也能愉快FQ. 只是最近学习前端的知识,需要FQ访问 MDN web docs ...
- redis键的过期和内存淘汰策略
键的过期时间 设置过期时间 Redis可以为存储在数据库中的值设置过期时间,作为一个缓存数据库,这个特性是很有帮助的.我们项目中的token或其他登录信息,尤其是短信验证码都是有时间限制的. 按照传统 ...
- B树、B+树
when ? why ? how ? what ? 平衡二叉树其查找的时间复杂度是 O(log2N)与树的深度相关,那么降低树的深度自然会提高查找效率. 如果我们要操作的数据集非常大,大到内存已经没法 ...
- nexus3的安装和使用
参考:https://www.cnblogs.com/2YSP/p/9533506.html http://www.54tianzhisheng.cn/2017/10/14/Nexus3-Maven/ ...