欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Fragment与Activity之间的通信

程序员文章站 2022-03-09 21:05:27
...

写在前面:Demo场景

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

Fragment与Activity之间的通信

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