Fragment之间的通信
在本节中,你会学到
1、定义接口
2、实现接口
3、将消息传递给fragment
为了重用Fragment UI 组件,在设计中你应该通过定义每一个fragemnt自己的layout和行为,让fragment的自包含和模块化。一旦你定义了这些可重用的 Fragment,你可以通过Activity将它们关联起来并通过程序的逻辑代码将他们连接起来以实现整体组合的UI。
你会经常想要一个fragment与另一个fragment通信,例如基于用户事件改变fragment中的内容。所有fragment质检单额通信都是通过Activity关联起来的。两个fragment之间不应该直接进行通信。
定义接口
为了允许fragment和它的Activity通信,你应该fragment类中定义一个接口并在Activity中实现它。Fragment在 onAttach()回调函数中获取接口的具体实现的对象。后面,fragment就可以调用接口中的方法实现与Activity的通信。
下面是一个Fragment一Activity通信的例子:
// 用来存放fragment的Activtiy必须实现这个接口 public interface OnHeadlineSelectedListener { public void onArticleSelected(int position); } @Override public void onAttach(Activity activity) { super.onAttach(activity); // 这是为了保证Activity容器实现了用以回调的接口。如果没有,它会抛出一个异常。 try { mCallback = (OnHeadlineSelectedListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnHeadlineSelectedListener"); } }
现在fragment可以通过使用实现了OnHeadlineSelectedListener接口的mCallback实例
调用onArticleSelected()方法(或其他在接口中的方法)将消息传递给Activity。
例如下面在fragment中的方法将会在用户点击一个List item的时候被调用。这个fragment使用回调接口将时间传递给父Activtity。
@Override public void onListItemClick(ListView l, View v, int position, long id) { // 发送时间给Activity宿主 mCallback.onArticleSelected(position); }
实现接口
为了接收从fragment传递过来的事件回调,宿主Activity必须实现定义在fragment类中的接口。
例如,下面的activity实现了上个例子中的接口。
public static class MainActivity extends Activity implements HeadlinesFragment.OnHeadlineSelectedListener{ ... public void onArticleSelected(int position) { // 用户选择了HeadlinesFragment中的头标题后 // 做一些业务操作 } }
将消息传递给fragment
宿主Activity可以通过调用findFragmentById()方法获取Fragment实例,然后直接调用Fragment的公有方法,将消息传递给Fragment。
例如,想象一下,之前讲过的Activity可能包含有其他的fragment,而这些fragment通过上面的回调函数返回的接口动态地显示一些内容。这种情况下,Activity可以将回调函数中接收到信息传递给需要的fragment。
public static class MainActivity extends Activity implements HeadlinesFragment.OnHeadlineSelectedListener{ ... public void onArticleSelected(int position) { // 用户选中HeadlinesFragment中的头标题后 // 做一些必要的业务操作 ArticleFragment articleFrag = (ArticleFragment) getSupportFragmentManager().findFragmentById(R.id.article_fragment); if (articleFrag != null) { // 如果 article frag 不为空,那么我们在同时显示两个fragmnet的布局中... // 调用ArticleFragment中的方法去更新它的内容 articleFrag.updateArticleView(position); } else { // 否则,我们就是在仅包含一个fragment的布局中并需要交换fragment... // 创建fragment并给他一个跟选中的文章有关的参数 ArticleFragment newFragment = new ArticleFragment(); Bundle args = new Bundle(); args.putInt(ArticleFragment.ARG_POSITION, position); newFragment.setArguments(args); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); // 用这个fragment替换任何在fragment_container中的东西 // 并添加事务到back stack中以便用户可以回退到之前的状态 transaction.replace(R.id.fragment_container, newFragment); transaction.addToBackStack(null); // 提交事务 transaction.commit(); } } }
相关文章
- Vue 非父子组件之间的通信
- 关于计算机与MCU通信及MAX232、CH340T与PL2303的区别
- 【微信小程序】-- 自定义组件 - 父子组件之间的通信(三十八)
- 【FPGA教程案例37】通信案例7——基于FPGA的FFT,IFFT傅里叶变换和逆变换
- 看懂iPASOLINK毫米波通信系统采用Xilinx Virtex
- 使用DNSCrypt来加密您与OpenDNS之间的通信
- 《云数据管理:挑战与机遇》2.1.5 基于广播和多播的组通信
- 《通信技术导论(原书第5版)》——1.8 协议和分层
- 《通信技术导论(原书第5版)》——2.4 骨干网和单个局域网结构
- 荷兰统一通信厂商欲挑战微软/Skype/Google
- 通信编程的几种类型
- ZeroMQ实例-使用ZeroMQ进行windows与linux之间的通信
- android即时通信开源项目信息
- Kubernetes之POD、容器之间的网络通信 同一个pod是本地是同个命名空间lo回环网卡通信 同一个node是docker0网桥模式mac查找 跨node是falnnel组成的二层网络查找 flannel是叠加网络封包和拆包
- 使用ESP8266实现单片机与上位机之间的wifi通信。
- linux c server and client 简单的通信
- 华为快应用-兄弟组件之间的通信
- 国外信息通信立法和政策最新趋势及分析