Activity与Fragment互传数据

Activity与Fragment

首先需要明确的是,ActivityFragment多对多关系。一个Activity中可以有多个Fragment,一个Fragment也可以存在于多个Activity中。

Activity向Fragment传递数据

跟Activity之间的互传数据一样需要通过Bundle对象作为载体进行传递。

  1. Fragment可以通过有参构造函数的参数接收Activity传来的数据。
public AFragment(String s) {
    Bundle bundle = new Bundle();
    //键值对
    bundle.putString("name", s);
    this.setArguments(bundle);
}
  1. Activity想要向一个Fragment对象传递对象时,调用Fragment的有参构造。
aFragment = new AFragment("Kiefer");
  1. Fragment通过key获取对应的value
String name = getArguments().getString("name");

Fragment向Activity传递数据

给定一个Activity对象,该对象中添加了一个Fragment对象,想通过点击Fragment中的一个按钮,实现对Activity的数据传送。

此时,Activity和Fragment是宿主关系,Activity对象中拥有一个Fragment对象,Fragment对象无法直接传递数据给Activity,那么只能提供一个回调接口给Activity。

  1. 首先,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 传递到此方法内)

  1. 重写onAttach()方法,获取Activity对象
//声明
private Message listener;

@Override
public void onAttach(@NonNull @NotNull Context context) {
    super.onAttach(context);
    listener = (IOnMessageClick) context;
}
  1. 为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

上一篇:viewPager2.setOffscreenPageLimit 预加载数量 进行fragment的懒加载


下一篇:jetpack之viewmodel