一、Activity传值给Fragment
1.方法一:(Fragment是动态加载的)在activity中建一个bundle,把要传的值存入bundle,然后通过fragment的setArguments(bundle)传到fragment,在fragment中,用getArguments接收
activity :
MyFragment fragment = new MyFragment();
Bundle bundle=new Bundle();
bundle.putString("one","要传的值");
fragment.setArguments(bundle);
FragmentManager fm = getFragmentManager();
FragmentTransaction ft=fm.beginTransaction();
ft.add(R.id.frame,myFragment,"myFragment");
ft.commit();
Fragment:
Bundle bundle=getArguments();
String s=bundle.getString("one");
2.方法二:(Fragment是静态加载的)在Fragment中设置set,get方法,在activity中获取Fragment对象,fragment.setValue(),Fragment中getValue()
注:静态加载Fragment的时候,一定要给Fragment设置一个唯一标识,id/tag
activity:
FragmentManager fm = getFragmentManager();
MyFragment myFragment = (MyFragment)fm.findFragmentById(R.id.fragment);
myFragment.setValue("传值");
Fragment:
private String value;
private void setValue(String value){
this.value = value;
}
private String getValue(){
return this.value;
}
//在需要获取的地方调用getValue()
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v=inflater.inflate(R.layout.fragment,null);
// 给fragment上的按钮添加点击事件
text = v.findViewById(R.id.tv_show);
btn = v.findViewById(R.id.btn_get);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
text.setText(getValue());
}
});
return v;
}
3.方法三:利用Fragment的生命周期onAttach()方法,获取宿主activity
activity中:
public String toValue(){
return "传值";
}
Fragment中:
@Override
public void onAttach(Context context) {
super.onAttach(context);
String value = ((MainActivity)context).toValue();
}
二、Fragment 向Activity传值(接口回调)
1.fragment中准备回调接口 接口中声明传值的回调方法
2.在fragment中定义变量 private MyListener myListener
3.重写fragment中的onAttach()方法:listener = (MyLisener)getActivity();
4.fragment触发事件时回传值
5.Activity中实现回调接口 重写回调方法获取回传的值并显示
Fragment:
public class MyFragment extends Fragment {
private Button btn;
private TextView text;
private String str;
//定义回调接口
public interface MyListener{
public void sendValue(String value);
}
private MyListener myListener;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v=inflater.inflate(R.layout.fragment,null);
// 给fragment上的按钮添加点击事件
text = v.findViewById(R.id.tv_value);
btn = v.findViewById(R.id.btn_send);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//通过调用在activity中实现的接口方法,把数据传给Mainactivity
myListener.sendValue("传值");
}
});
return v;
}
//activity和fragment联系时候调用,fragment必须依赖activty
@Override
public void onAttach(Context context) {
super.onAttach(context);
//获取实现接口的activity
myListener = (MyListener) getActivity();//或者myListener=(MainActivity) context;
}
}
Activity:
public class MainActivity extends BaseActivity implements MyListener{
//myFragment中的接口实现
public void sendValue(String value) {
Log.e(TAG,value);
}
}
三、Fragment与Fragment之间的传值
1.方法一:我们可以通过宿主Activity拿到FragmentManager,进而再通过id或者tag拿到别的Fragment的实例,然后调用相应的方法
public class Fragment1 extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v=inflater.inflate(R.layout.fragment1,null);
// 给fragment上的按钮添加点击事件
v.findViewById(R.id.btn_change).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//拿到frgment---fragment之间的通信
Fragment2 f2= (Fragment2) getActivity().getFragmentManager().findFragmentByTag("two");
//two是fragment2的tag, 切换fragment
beginTracsaction.replace(R.id.lltwo,new Fragment2(),"two");中two是tag
f2.setValue("fragment1传值");
}
});
return v;
}
}
2.方法二:实现接口
AFragment要调用BFragment的方法,在BFragment中建立接口callback 让宿主activity中实现该接口
在AFragment中的onAttach方法中 调用宿主的callback方法 在宿主activity callback 的方法中再调用BFragment想对应的方法
四、EventBus
EventBus是一款Android下的发布/订阅事件总线机制。可以代替Intent、Handler、Broadcast等在Fragment、Activity之间传递消息。
优点:开销小,代码优雅。将发送者和接受者解耦。
具体使用请参考另一篇文章:https://blog.csdn.net/Silence_Sep/article/details/81221466
参考:https://blog.csdn.net/u011146511/article/details/80485362