关于Fragment与Fragment、Activity通信的三种方式
2016-07-13 15:16
344 查看
http://www.2cto.com/kf/201511/449940.html
关于Fragment与Fragment、Activity通信的三种方式2015-11-16 0 个评论 来源:江南一点雨的专栏
收藏
![](https://oscdn.geek-share.com/Uploads/Images/Content/201605/95ed9f6c0a2e868a33977b3fb0089746.jpg)
我要投稿
一直想总结一下Fragment与Fragment、Activity通信的问题,今天有时间一共总结了三种,权当抛砖引玉,如果大家还有更好的方式来实现Fragment和Fragment、Activity的通信,欢迎提出来,我们一起学习。好了,我们先来看看今天要实现的一个效果图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/12/8835d1634c4b8ef219a38c311efb8a1b.gif)
左边是一个Fragment,右边是一个Fragment,当我们点击左边的Fragment的时候,右边的Fragment中显示出我们所点击的人的作品,我们就来看看怎样实现两个Fragment之间的通信。
我们通过宿主Activity拿到FragmentManager,进而再拿到右边的Fragment,然后调用右边Fragment里边的showPro方法,其中要传入的参数是左边点击的人名,我们看看右边Fragment中的showPro方法:
先根据传进来的人名拿到该人作品的数据集,然后构造一个adapter赋值给listview,很简单吧。使用这种方式我们可以直接在一个Fragment中调用另一个Fragment的公开方法,从而实现两个Fragment的通信。
这种方法适于那些我们在布局文件中就已经定义了的Fragment,这种Fragment每个都有id,可以通过FragmentManager找到,但是如果我们使用了ViewPager,即每个Fragment都是动态添加进来的,这个时候我们无法通过FragmentManager获得另外一个Fragment的实例,那么该怎么办呢?这时我们就要用到下面这种方式了。
然后定义一个接口变量:
我们要在宿主Activity中实现这个接口,这样当Fragment调用onAttach方法时我们就可以实例化这个接口了:
当mCallback实例化之后,那么我们在点击韩愈的时候就可以调用这里边的showProByName方法了:
当然,这个方法的具体实现在宿主Activity中,当宿主Activity实现了showPro接口之后,接着就要实现它里边的方法了:
我们在接口的方法中调用右边Fragment中的showPro方法,并将当前人名作为参数传入,这个方法与1中相同,我就不贴代码了。这个方法与1中介绍的方法相比,虽然有点麻烦,但是可以有效的解决在一个Fragment中拿不到另一个Fragment实例的问题,具体应用场景就是ViewPager中的Fragment之间通信。
在右边Fragment中接收广播:
这些都是广播基本的使用方法,我就不啰嗦了。
个人觉得,虽然广播用起来最方便,但是在选择使用哪种通信方式的时候,优先选择上面两种,如果前两种方式都不可以,再考虑使用广播。
如果大家还有更好的实现两个Fragment通信的方式,欢迎提出来,一起学习。
关于Fragment与Fragment、Activity通信的三种方式2015-11-16 0 个评论 来源:江南一点雨的专栏
收藏
![](https://oscdn.geek-share.com/Uploads/Images/Content/201605/95ed9f6c0a2e868a33977b3fb0089746.jpg)
我要投稿
一直想总结一下Fragment与Fragment、Activity通信的问题,今天有时间一共总结了三种,权当抛砖引玉,如果大家还有更好的方式来实现Fragment和Fragment、Activity的通信,欢迎提出来,我们一起学习。好了,我们先来看看今天要实现的一个效果图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/12/8835d1634c4b8ef219a38c311efb8a1b.gif)
左边是一个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(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(getActivity(), android.R.layout.simple_list_item_1, list); lv.setAdapter(adapter); } }; localBroadcastManager.registerReceiver(br, intentFilter);
这些都是广播基本的使用方法,我就不啰嗦了。
个人觉得,虽然广播用起来最方便,但是在选择使用哪种通信方式的时候,优先选择上面两种,如果前两种方式都不可以,再考虑使用广播。
如果大家还有更好的实现两个Fragment通信的方式,欢迎提出来,一起学习。
相关文章推荐
- Xargs的用法和理解
- Docker容器案例:应用 Mysql
- JavaScript详解
- 心灵可以停停,代码还得敲敲
- linux 中 timeval结构体
- 有一个会做饭的男朋友幸福么?
- 关于HTML5
- 不良资产处置(四):国内外不良资产处置公司的背景特点
- 判定覆盖和条件覆盖
- Block很简单,就像delegate的简化版
- 什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI
- ios字典功能UIReferenceLibraryViewController
- CodeForces 567C Geometric Progression
- 滚动 CSS3 鼠标滚轮滚动插件jQuery Smoove.js
- python 读文件 写文件 字符串操作 LIBSVM格式数据转换
- ViewPagerIndcatior 的使用
- C# 操作mongodb子文档
- pch文件里含有的某些头文件未包含
- Linux信号
- b ,B,KB,MB,GB之间的关系