Fragment与Fragment、Activity通信(2)

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

/

 

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

 

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

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

 

?
1
2
3
4
ContentFragment cf = (ContentFragment) getActivity()
                             .getFragmentManager().findFragmentById(
                                     R.id.content_fg);
                     cf.showPro(name);

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

 

 

?
1
2
3
4
5
6
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);
}</string>
先根据传进来的人名拿到该人作品的数据集,然后构造一个adapter赋值给listview,很简单吧。使用这种方式我们可以直接在一个Fragment中调用另一个Fragment的公开方法,从而实现两个Fragment的通信。

 

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

2.使用接口

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

然后定义一个接口变量:
?
1
private showPro mCallback;

我们要在宿主Activity中实现这个接口,这样当Fragment调用onAttach方法时我们就可以实例化这个接口了:
?
1
2
3
4
5
6
7
@Override
public void onAttach(Activity activity) {
     super .onAttach(activity);
     if (activity != null ) {
         mCallback = (showPro) activity;
     }
}
当mCallback实例化之后,那么我们在点击韩愈的时候就可以调用这里边的showProByName方法了:
?
1
2
3
4
5
6
7
8
9
10
11
12
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接口之后,接着就要实现它里边的方法了:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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中发送广播:
?
1
2
3
4
Intent intent = new Intent(showPro);
                     intent.putExtra(name, name);
                     LocalBroadcastManager.getInstance(getActivity())
                             .sendBroadcast(intent);

在右边Fragment中接收广播:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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);</string>

这些都是广播基本的使用方法,我就不啰嗦了。
个人觉得,虽然广播用起来最方便,但是在选择使用哪种通信方式的时候,优先选择上面两种,如果前两种方式都不可以,再考虑使用广播。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值