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

需求

  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;
            }
        }
    }
};

猜你喜欢

转载自blog.csdn.net/LemonXQ/article/details/78568372