Fragment与Activity之间的通信

写在前面:Demo场景

一个Activity中含有两个Fragment(左下角的在代码中命名为Fragment1,右下角的在代码中命名为Fragment2),Activity中的状态栏用于显示Fragments的颜色色码值,Activity中的EditText和Button为一组用来更改Fragment1的颜色。类似的Fragment1可以更改Fragment2的颜色。Fragment1的状态栏用于显示Activity的变色请求,Fragment2的状态栏用于显示Fragment1的变色请求。

一、Activity把数据传递给Fragment

1.使用Bundle来传递数据

1.在Activity中绑定数据到Fragment上

Fragment1 fragment = new Fragment1();
Bundle bundle = new Bundle();
bundle.putString(COLORKEY,color);
fragment.setArguments(bundle);

2.在Fragment中拿到Bundle对象

Bundle bundle = getArguments();

3.demo中的应用场景:

Activity中的Button点击监听

btnFragment1Color.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String color = etFragment1Color.getText().toString();
        Fragment1 fragment = Fragment1.bundleColorToFragment1(color);
        replaceFragment(R.id.left_frame_layout,fragment);
    }
});
/**
 * 绑定色码到碎片1,需要提交事务之后变色才会生效
 * */
public static Fragment1 bundleColorToFragment1(String color){
    Fragment1 fragment = new Fragment1();
    Bundle bundle = new Bundle();
    bundle.putString(COLORKEY,color);
    fragment.setArguments(bundle);
    return fragment;
}

Fragment1解析Bundle数据

Bundle bundle = getArguments();
if(bundle!=null){
    String color = bundle.getString(COLORKEY);
    constraintLayout.setBackgroundColor(Color.parseColor(color));
    tvStateBar.setText("Activity请求变色为:"+color);
    colorChangeListener.fragment1Change(color);
}

二、Fragment把数据传递给Activity

1.使用回调接口

1.在需要发送数据的一边中添加内部接口(这里仅以Fragment1为例)

/**
 * 内部接口,用于监听该碎片(碎片1的颜色变化)
 * */
public interface OnColorChangeListener{
    void fragment1Change(String color);
}

2.在发送方中添加内部接口的成员变量

private OnColorChangeListener colorChangeListener;

3.在发送方中添加内部接口成员变量的实例化方法,因为该demo场景是Activity监听Fragment的颜色变化,我就没有再写setOnColorChangeListener()方法了,当然写这个方法去给activity设置监听器也是没问题的。

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if(context instanceof OnColorChangeListener) {
        colorChangeListener = (OnColorChangeListener)context;
    } else{
        throw new IllegalArgumentException("context must implements FragmentInteraction");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    colorChangeListener = null;
}

4.给接收方设置监听器,如果1.3中添加了setOnColorChangeListener()方法,那么在这里就用该方法为activity设置监听器。我这里直接让Activity实现OnColorChangeListener接口:

public class SecondActivity extends AppCompatActivity implements Fragment1.OnColorChangeListener,Fragment2.OnColorChangeListener
@Override
public void fragment1Change(String color) {
    leftFragmentColor = color;
    refreshStateBar();
}

5.在发送方中发送数据

colorChangeListener.fragment1Change(color);

三、Fragment之间的通信

1.原理还是Activity发送数据给Fragment

1.在Fragment中先获取Activity环境

getActivity();

2.然后和Activity发送数据给Fragment一样,借由Bundle来传递数据

Fragment2 fragment = new Fragment2();
Bundle bundle = new Bundle();
bundle.putString(COLORKEY,color);
fragment.setArguments(bundle);

3.demo中的应用场景:

Fragment1中的Button点击监听

btnFragment2Color.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String color = etFragment2Color.getText().toString();
        Fragment2 fragment = Fragment2.bundleColorToFragment2(color);
        FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.right_frame_layout,fragment);
        transaction.commit();
    }
});
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值