一直想总结一下Fragment与Fragment、Activity通信的问题,今天有时间一共总结了三种,权当抛砖引玉,如果大家还有更好的方式来实现Fragment和Fragment、Activity的通信,欢迎提出来,我们一起学习。好了,我们先来看看今天要实现的一个效果图:

左边是一个Fragment,右边是一个Fragment,当我们点击左边的Fragment的时候,右边的Fragment中显示出我们所点击的人的作品,我们就来看看怎样实现两个Fragment之间的通信。

1.直接在一个Fragment中调用另外一个Fragment中的方法

我们可以直接在一个Fragment中调用另外一个Fragment的公开方法,前提是要先拿到另外一个Fragment的实例,我们先来看看怎样在左边的Fragment中拿到右边Fragment的实例:

ContentFragment cf = (ContentFragment) getActivity()
.getFragmentManager().findFragmentById(
R.id.content_fg);
cf.showPro(name);

我们通过宿主Activity拿到FragmentManager,进而再拿到右边的Fragment,然后调用右边Fragment里边的showPro方法,其中要传入的参数是左边点击的人名,我们看看右边Fragment中的showPro方法:

	public void showPro(String key) {
list = map.get(key);
adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, list);
lv.setAdapter(adapter);
}

先根据传进来的人名拿到该人作品的数据集,然后构造一个adapter赋值给listview,很简单吧。使用这种方式我们可以直接在一个Fragment中调用另一个Fragment的公开方法,从而实现两个Fragment的通信。

这种方法适于那些我们在布局文件中就已经定义了的Fragment,这种Fragment每个都有id,可以通过FragmentManager找到,但是如果我们使用了ViewPager,即每个Fragment都是动态添加进来的,这个时候我们无法通过FragmentManager获得另外一个Fragment的实例,那么该怎么办呢?这时我们就要用到下面这种方式了。

2.使用接口

接口可以实现两个Fragment之间的通信,也可以实现Fragment和Activity之间的通信,这大概是用的比较多的一种方式,也是个人比较推荐的一种方式,使用接口来实现两个Fragment之间通信,要通过宿主Activity中转一下,如果是Fragment和宿主Activity通信则直接调用即可,我们先看看上图中点击韩愈的时候怎么出现他的作品。首先在左边的Fragment中定义一个接口:
	public interface showPro {
public void showProByName(String name);
}

然后定义一个接口变量:

private showPro mCallback;

我们要在宿主Activity中实现这个接口,这样当Fragment调用onAttach方法时我们就可以实例化这个接口了:

	@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (activity != null) {
mCallback = (showPro) activity;
}
}

当mCallback实例化之后,那么我们在点击韩愈的时候就可以调用这里边的showProByName方法了:

		lv.setOnItemClickListener(new OnItemClickListener() {

			@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
TextView nameTV = (TextView) view;
String name = nameTV.getText().toString();
if ("韩愈".equals(name)) {
mCallback.showProByName(name);
}
}
});

当然,这个方法的具体实现在宿主Activity中,当宿主Activity实现了showPro接口之后,接着就要实现它里边的方法了:

public class MainActivity extends Activity implements showPro {

	private ContentFragment cf;

	@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getActionBar().hide();
cf = (ContentFragment) getFragmentManager().findFragmentById(
R.id.content_fg);
} @Override
public void showProByName(String name) {
cf.showPro(name);
}
}

我们在接口的方法中调用右边Fragment中的showPro方法,并将当前人名作为参数传入,这个方法与1中相同,我就不贴代码了。这个方法与1中介绍的方法相比,虽然有点麻烦,但是可以有效的解决在一个Fragment中拿不到另一个Fragment实例的问题,具体应用场景就是ViewPager中的Fragment之间通信。

3.使用广播

不论我们有没有用ViewPager,都可以用广播实现两个Fragment之间的通信,广播算是这里最灵活的通信方式了,我们看看在左边Fragment中发送广播:
Intent intent = new Intent("showPro");
intent.putExtra("name", name);
LocalBroadcastManager.getInstance(getActivity())
.sendBroadcast(intent);

在右边Fragment中接收广播:

		LocalBroadcastManager localBroadcastManager = LocalBroadcastManager
.getInstance(getActivity());
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("showPro");
BroadcastReceiver br = new BroadcastReceiver() { @Override
public void onReceive(Context context, Intent intent) {
String key = intent.getStringExtra("name");
list = map.get(key);
adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, list);
lv.setAdapter(adapter);
} };
localBroadcastManager.registerReceiver(br, intentFilter);

这些都是广播基本的使用方法,我就不啰嗦了。

个人觉得,虽然广播用起来最方便,但是在选择使用哪种通信方式的时候,优先选择上面两种,如果前两种方式都不可以,再考虑使用广播。

续:

之前还忽略了一种,这里补充一下。

4.Fragment直接调用Activity中的public方法

我们也可以直接在Fragment中调用Activity中的公开方法,如下:

((MainActivity) getActivity()).showProByName(name);

这里的showProByName就是我们上文贴出来的那个MainActivity中的方法。

如果大家还有更好的实现两个Fragment通信的方式,欢迎提出来,一起学习。

关于Fragment与Fragment、Activity通信的四种方式的更多相关文章

  1. Android跨进程通信的四种方式

    由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于andro ...

  2. Activity启动的四种方式

    Activity启动方式有四种,分别是: standardsingleTopsingleTasksingleInstance 可以根据实际的需求为Activity设置对应的启动模式,从而可以避免创建大 ...

  3. mobile app 与server通信的四种方式

    Have you ever wondered how the information gets into the application installed in your mobile device ...

  4. OAuth 2.0 的四种方式

    上一篇文章介绍了 OAuth 2.0 是一种授权机制,主要用来颁发令牌(token).本文接着介绍颁发令牌的实务操作. 下面我假定,你已经理解了 OAuth 2.0 的含义和设计思想,否则请先阅读这个 ...

  5. OAuth - 四种方式

    OAuth 2.0 的标准是 RFC 6749 文件.该文件先解释了 OAuth 是什么. OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有者.......资源所有者同意以后,资 ...

  6. Android异步更新UI的四种方式

    Android异步更新UI的四种方式 2015-09-06 09:23 segmentfault 字号:T | T 大家都知道由于性能要求,android要求只能在UI线程中更新UI,要想在其他线程中 ...

  7. 给TextView添加超链接的四种方式

    因为在上上篇博客中介绍了SpannableString的使用(SpannableString使用详解),由此想到给TextView添加超链接究竟有多少种方式?经过个人总结,现在一共发现四种,如果还有其 ...

  8. android activity启动的4种方式记录及打开其他应用的activity的坑

    Android启动的四种方式分别为standard,singleTop,singleTask,singleInstence. standard是最常见的activity启动方式,也是默认的启动的方式. ...

  9. UI的线程问题:单线程原因及更新UI的四种方式

    1.UI线程为什么设计为单线程? UI控件的操作不是线程安全的,对于多线程并发访问的时候,如果使用加锁机制会导致: UI控件的操作变得很复杂. 加锁的操作必定会导致效率下降. 所以android系统在 ...

随机推荐

  1. PHP奇趣笔试试题一则

    $a = 3; $b = 5; if($a = 5 || $b = 7){ $a++; $b++; } echo $a, ' ', $b; 输出结果为: A.6 8 B.6 6 C.2 6 D.1 6 ...

  2. 公司估值(贴现现金流量法DCF)

    创业公司总会遇到并购或者入股等情况,CEO需要了解一些公司估值的方法,本文主要介绍贴现现金流量估值方法,供大家参考: 中国资产评估协会要求:在对企业价值进行评估时,应分析收益法.市场法和资产基础法三种 ...

  3. 精通phthon的条件

    1. 熟知主流硬件体系(x86, x64)2. 熟知 CPython 的具体实现,如若可能至少通读源码三遍以上3. 熟知每条 Python bytecode 如何被解释执行4. 熟知每条 Python ...

  4. .net析构函数对垃圾回收的影响简析

    这里说析构函数,其实并不准确,应该叫Finalize函数,Finalize函数形式上和c++的析构函数很像 ,都是(~ClassName)的形式,但是功能上完全不一样.析构函数编译成il语言后会变成一 ...

  5. 【HDOJ】5564 Clarke and digits

    DP+快速矩阵幂.注意base矩阵的初始化,不难. /* 5564 */ #include <iostream> #include <string> #include < ...

  6. Android开发之ADT中无Annotation Processin的解决办法

    使用ButterKnife的时候,进入ADT中设置的时候发现在Java Compiler展开后无Annotation Processin 解决办法: 安装插件:Juno - http://downlo ...

  7. AOP 实现的原理简析

    AOP简介 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能 ...

  8. Linux下归档与压缩工具笔记

    tar具体使用笔记 归档工具 tar 语法 功能 选项 常见搭配 压缩工具 bzip2 工具 使用方法 gzip 工具 zip 工具 归档工具 tar tar是一个开源的Linux/Unix中最广泛使 ...

  9. HDOJ 2167 Pebbles (状态压缩dp)

    题意:给你一个n*n的矩阵,让你从矩阵中选择一些数是的他们的和最大,规则是:相邻的两个数不能同时取,位置为(i,j)的数与(i+1,j),(i-1,j),(i,j+1),(i,j-1),(i+1,j+ ...

  10. GUN/GPL 中文译文

    版权所有 (C) 1989,1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307U ...