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();
}
}
}
 
 
#########################################################

[Android][Fragment][转]Fragment之间的通信

(2014-01-07 15:02:45)

标签:

fragment

it

分类: Android

在本节中,你会学到

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();
}
}
}
 
 
 
分享:

 

2

喜欢

0

赠金笔

http://www.cnblogs.com/kissazi2/p/3440257.html

http://blog.sina.com.cn/s/blog_75992b660101os3k.html

fragment 数据传递,通信的更多相关文章

  1. Activity与Fragment数据传递之Fragment从Activity获取数据

    整理Fragment与Activity之间的数据交换,大体上包括三种: 1.Fragment从Activity获取数据 2.Activity从Fragment获取数据 3.Fragment之间获取数据 ...

  2. fragment 数据传递,传值,通信

    [原][Fragment精深系列4]Fragment与Activity之间的数据交互 2015-5-26阅读389 评论0   以下内容来自于自己的实践和网络资料的整理,希望对你有帮助. 一.Acti ...

  3. C#不同窗体间通信,数据传递

    在一个项目中,很多时候都需要在窗体间进行数据传递和通信,最觉见的是父子窗体之间的数据传递,比如登录ID,各个窗体都需要知道.有很多文章都写了这方面的问题,提出很多优秀的方法,鄙人不才,搜了一些资料之后 ...

  4. Fragment+Activity传递数据

    自己经常使用的知识点,每次到要用的时候都还要再查一次才能懂得使用,终于体会到总结的必要性了. Activity传递数据给Fragment Bundle bundle_fragment=new Bund ...

  5. Android开发——fragment中数据传递与刷新UI(更改控件)

    数据传递: 1.通过数据库进行数据的传递 如在fragment中将数据保存在数据库中,之后其他的fragment或者activity直接读取数据库中的数据,数据库使用还算简单,这里就不多说,建议使用l ...

  6. Android Fragment之间传递List数据

    要说的是在两个Fragment之间传递List数据,比如有个List<User>,以及传递字符串数据,比如testId,该如何从FragmentA传递到FragmentB呢? 下面这个例子 ...

  7. Fragment间的通信

    在网上看到的一篇文章,总结的很好 为了重用Fragment的UI组件,创建的每个Fragment都应该是自包含的.有它自己的布局和行为的模块化组件.一旦你定义了这些可重用的Fragment,你就可以把 ...

  8. EventBus的使用,数据传递

    通常情况下安卓下数据的传递有下面几种方法: 1.通过intent传递,包括显式意图和隐式意图,广播(Broadcast)和服务都能通过Intent传递 传递的数据类型包括8大基本数据类型    实现P ...

  9. Activity与Fragment之间的通信

    由于Fragment的生命周期完全依赖宿主Activity,所以当我们在使用Fragment时难免出现Activity和Fragment间的传值通信操作. 1.Activity向Fragment,通过 ...

随机推荐

  1. html元素中class属性值多个空格分格是什么意思?

    即指定多个class,这是bootstrap常干的事,比如 <div class="alert alert-info"> 请问,这两个class之间的关系是什么,二者的 ...

  2. php 项目简单分类

    项目分为:客户需求和自行研发. 商城项目:------------------------商城分类:单商家:商家就是网站所有者.如京东.凡客.          多商家:如淘宝 网站所有者不是卖家.  ...

  3. 安装 nodejs

    接下来使用npm命令安装express和socket.io 没有的话 用yum 安装一下 12 npm install --save expressnpm install --save socket. ...

  4. StartSSL证书申请

    StartSSL官方地址: http://www.startssl.com/ 申请过程: 1)填写资料 2) 获取得验证码 3)提交验证码,等待6小时审核. 4)再次获得验证码,提交等待审核 5)审核 ...

  5. textFiled输入字数的控制问题之—把带输入的拼音也判断了

    一个textFiled,控制只能输入五个字,现在你已经输入了四个字,在输入第五个字的时候,输入一个拼音之后就不能输入后一个拼音,这里把拼音也当成字来判断了,这种情况下就需要_textFiled.mar ...

  6. git 使用总结

  7. 浅谈SQL Server 对于内存的管理

    简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) ...

  8. java解析XML获取城市代码

    运行前先导入dom4j架包,由于我们公司用的代理服务器所以下面我设置了代理ip,不需要的可直接忽略 package com.chengshidaima.tools; import java.io.Bu ...

  9. js 关键字 in

    对于数组 ,迭代出来的是数组元 素,对于对象 ,迭代出来的是对象的属性: var x var mycars = new Array() mycars[0] = "Saab" myc ...

  10. iOS 常用代码块

    1.判断邮箱格式是否正确的代码: // 利用正则表达式验证 -( BOOL )isValidateEmail:( NSString  *)email {   NSString  *emailRegex ...