###前言
之前讲过Activity向Fragment传值的具体方法,也附带讲了些Activity向Fragment传值需要注意的问题,然后讲了activity和fragment对返回键的处理。那么,这节我们就来讲讲Fragment怎么向Activity传值吧。
今天涉及的知识有:
1. Fragment 向 activity 传值的前提条件
2. Fragment的代码处理
3. Activity对于回传代码的接收处理
4. 效果图和项目结构图
先来波效果图吧:
![](/contentImages/image/20190719/ByZoi4DkjgUFEup34v3.gif)
####一. Fragment 向 activity 传值的前提条件
Fragment 向activity 传值,那么首先我们需要在fragment里面定义一个公开传值的接口类,如下:
```
public class FragmentB extends Fragment{
//其他代码省略
//......
/**fragment给activity回传值的接口**/
public interface OnFragmentListener{
/**object需要实现Serializable或Parcelable接口**/
void onFragment(String clsNameDetail, Object object);
}
}
```
其中,clsNameDetail作为是传到Activity中接收用于区分来自哪个Fragment的标志,我一般习惯用当前Fragment的类名,第二个参数 object 为传值的具体内容,最好规定一个泛型,方便传不同类型的值。
####二. Fragment的代码处理
声明完回调接口后,Fragment还需要做以下几件事:
1. 声明回调传值的接口对象
2. 写一个用于传值设置回调监听的方法
3. 设置回调监听
4. 在fragment需要向activity传值的地方调用onFragment方法将值传给activity
具体代码demo中有,这里主要讲下在fragment向activity传值的时候需要做下非空判断,例如我点击TextView要给MainActivity传值,那么我在Fragment中要这样处理:
```
//点击回传值给activity
mTvTestB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//给Activity传值
if(mOnFragmentListener!=null){
mOnFragmentListener.onFragment("FragmentB","我是FragmnetB传过来的值");
}
}
});
```
FragmentB中对应的XML文件fragment_b.xml代码十分简单,如下:
```
```
####三. Activity对于回传代码的接收处理
在MainActivity中接收Fragemnt传真过来的值,只需要做两步动作
1. activity实现FragmentB中的OnFragmentListener接口
2. 在onFragment(String clsNameDetail, Object object)方法中根据接收不同的fragment传过来的值做对应处理接口
具体逻辑代码如下:
```
//1. activity实现FragmentB中的OnFragmentListener接口
public class MainActivity extends AppFragActivity implements FragmentB.OnFragmentListener {
@BindView(R.id.tv_text)
TextView mTvText;
@Override
public void onFragment(String clsNameDetail, Object object) {
//2.根据接收不同的fragment传过来的值做对应处理接口
//接收FragmentB传过来的值
if("FragmentB".equals(clsNameDetail)){
mTvText.setText(object.toString());
}
}
}
```
####四. 效果图和项目结构图
运行效果图如下:
![](/contentImages/image/20190719/ByZoi4DkjgUFEup34v3.gif)
项目结构图
![](/contentImages/image/20190719/b5gB4MrV2Cxw7b2oeeY.png)
详细代码参考demo,demo中有对每个步骤的具体讲解,这里就不啰嗦了。