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();
}
});
推荐阅读