activity与fragment的传递信息
1、activity与fragment的关系:
为什么要进行通信呢?首先我们先来看看两者之间是什么关系
From李诗雨—https://blog.csdn.net/cjm2484836553/article/details/105150473
1)fragment是依赖activity存在的,不能独立存在,而activity是fragment的一个容器;
2)一个activity有多个fragment,而一个fragment可以别多个activity重用;
3)fragment有自己的生命周期,能接收输入事件;
4)能在activity运行时可以动态添加或删除fragment。
2、activity与fragment通信bundle方法
activity将信息主动传给fragment——bundle通信。(数据的载体)
1)让activity把消息传给fragment,上次我们新建了一个空白的fragment,在点击按钮时转换到这个fragment。现在在转换前我们先添加一个存放数据的载体bundle,bundle可以传很多数据类型,当要传一个javabean时用putParcelable。构造一个fragment,调用fragment里的Fragment.setArguments(Bundle bundle)来传递参数。 setArguments方法的调用必须要在Fragment与Activity关联之前。(在FragmentTransaction 的commit之前使用)
Bundle bundle=new Bundle();
bundle.putString("message","我喜欢安卓");
BlankFragment01 bf = new BlankFragment01();
bf.setArguments(bundle);
replacefragment(bf);`
2)在blankfragment里任何地方获取传的信息bundle。
例如在onCreate方法里获取activity里的信息。
Bundle bundle=this.getArguments();//伴随着fragment产生的arguments
//返回的是activity里传进去的bundle
String string=bundle.getString("message");
Log.d(TAG, "onCreate: "+string);
Java语言中类与类通信方案:接口
一、activity接收来自fragment的消息
1)先定义一个接口,在接口里创建两个抽象函数,一个用来将activity的信息给fragment,一个是fragment传送信息给activity。
void sendmsgtoactivity(String msg);
String getmsgfromactivity(String msg);
2)不要Mainactivity里实现一个接口,该接口是一个抽象的接口,无法创建对象。要到blankfragment里面定义一个接口类型对象,并写出一个赋值的公有方法setFragmentCallback。
private IFragmentCallback fragmentCallback;
public void setFragmentCallback(IFragmentCallback iFragmentCallback){
fragmentCallback=iFragmentCallback;
}
3)在activity里可以通过创建fragment的对象时调用赋值的函数,定义一个匿名内部类。
bf.setFragmentCallback(new IFragmentCallback() {
@Override
public void sendmsgtoactivity(String msg) {
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}@Override
public String getmsgfromactivity(String msg) {
return null;
} });
4)通过button来触发接受消息。在fragment_xml中添加一个button按钮。
5)响应button一般在onResume()中,也可以在onCreateView()里。定义一个View来解析,为防止多次重复解析。添加一个判断如果没有解析过则才解析。然后再返回我们的视图,返回之前绑定button。当点击button时会把消息发给activity。
if(rootview==null) {
rootview = inflater.inflate(R.layout.fragment_blank01, container, false);
}
Button btn=rootview.findViewById(R.id.btn_3);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
fragmentCallback.sendmsgtoactivity(“Hello this is from fragment”);
}
});
return rootview;
二、fragment获取activity中的消息
1)只用再实现一个 抽象方法String getmsgfromactivity(String msg);让其返回我们获取的消息。
2)在fragment里获取activit传出的消息。