Activity与Fragment
首先需要明确的是,Activity与Fragment是多对多关系。一个Activity中可以有多个Fragment,一个Fragment也可以存在于多个Activity中。
Activity向Fragment传递数据
跟Activity之间的互传数据一样需要通过Bundle对象作为载体进行传递。
- Fragment可以通过有参构造函数的参数接收Activity传来的数据。
public AFragment(String s) {
Bundle bundle = new Bundle();
//键值对
bundle.putString("name", s);
this.setArguments(bundle);
}
- Activity想要向一个Fragment对象传递对象时,调用Fragment的有参构造。
aFragment = new AFragment("Kiefer");
- Fragment通过key获取对应的value
String name = getArguments().getString("name");
Fragment向Activity传递数据
给定一个Activity对象,该对象中添加了一个Fragment对象,想通过点击Fragment中的一个按钮,实现对Activity的数据传送。
此时,Activity和Fragment是宿主关系,Activity对象中拥有一个Fragment对象,Fragment对象无法直接传递数据给Activity,那么只能提供一个回调接口给Activity。
- 首先,Fragment中需要提供一个回调接口,供Activity类实现,Activity必须实现该接口,并重写接口中的函数,通过该函数的参数就可以获取Fragment传递的数据。
//Fragment中定义接口
public interface Message {
void onClick(String text);
}
//Activity中实现接口并重写函数,函数参数text就是Fragment所传递的数据
@Override
public void onClick(String text) {
doSomething(text);
}
onAttach()
方法是Fragment生命周期的第一步,它的作用在Fragment和Activity建立关联时调用(Activity 传递到此方法内)
- 重写
onAttach()
方法,获取Activity对象
//声明
private Message listener;
@Override
public void onAttach(@NonNull @NotNull Context context) {
super.onAttach(context);
listener = (IOnMessageClick) context;
}
- 为Fragment中的按钮添加监听器,实现传递数据
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onClick("传递的数据");
}
});
onAttach()参考https://blog.csdn.net/qq_33210042/article/details/105628317
Fragment生命周期参考https://www.jianshu.com/p/70d7bfae18f3