使用Bundle+Message+Handler实现Fragment与Activity通信(可互传数据互调用方法)

来源:互联网 发布:mac电池循环次数 cmd r 编辑:程序博客网 时间:2024/05/19 18:42

需求

  Fragment中监听到组件事件后,将相应的参数封装后传递给Activity,同时调用Activity中某个方法

实现思路

  1. Fragment中使用Bundle对欲传递的多个数据进行打包,生成Bundle对象。同时,创建Message对象,设置Message对象的数据源为打包后的Bundle对象,设置Message对象的what字段以便提取message时进行识别。
  2. Activity中定义一个Handler,接收Fragment传递过来的Message对象,提取Message对象中的Bundle对象,取得Bundle中的数据,调用想调用的某个方法。

实现代码

Fragment中:

private void SetListeners(){   // 设置分析按钮监听   analyseBtn.setOnClickListener(new View.OnClickListener() {       @Override       public void onClick(View view) {           // 创建Message及Bundle对象           Message msg = new Message();           Bundle bundle = new Bundle();           // bundle填充数据           bundle.putInt("age",age);           bundle.putFloat("height",height);           bundle.putFloat("weight",weight);           bundle.putFloat("OGTT",ogtt);           // 设置msg的what字段及数据源           msg.what = 1;           msg.setData(bundle);           // 发送Message           handler.sendMessage(msg);       }   })}

Activity中:

// 定义一个Handler用于接收Fragment给Activity发出来的指令@SuppressLint("HandlerLeak")public Handler handler=new Handler(){    @Override    public void handleMessage(Message msg) {        super.handleMessage(msg);        if(msg!=null){            switch (msg.what) {                // 根据what字段辨识出消息                case 1:                    // 取出数据包,解包得数据                    Bundle bundle = msg.getData();                    age = bundle.getInt("age");                    weight = bundle.getFloat("weight");                    height = bundle.getFloat("height");                    ogtt = bundle.getFloat("OGTT");                    // 此处调用Activity中你想调用的方法                    AnalyseDIAB(age,height,weight,ogtt);                    break;                default:                    break;            }        }    }};
阅读全文
0 0
原创粉丝点击