回调函数实现Dialog对Activity数据的传输

1.回调函数

回调函数的定义为:程序C调用S中的函数A,通过这个函数进入到程序S中,程序S执行代码到一定程度会反过来调用程序C中的函数B,这个函数B对于程序C来讲就叫做回调函数。

回调函数的理解:(1)程序C不直接调用程序内的回调函数B,而是通过程序A间接地对回调函数B进行回调;

        (2)程序S必须事先知道回调函数的函数原型,方便进行调用,因此必须事先约定一个接口(interface B),规定传输的参数类型,返回值类型;

        (3)回调函数B是对接口(interface B)的实现;也就是说,服务器程序S以及接口相当于设计了一个框架,而客户端程序C内部会对回调函数B进行实现;

        (4)回调的过程:程序C通过调用函数A将自己的程序入口地址传给程序S,程序S运行后,会通过传过来的入口地址来访问程序C并调用内部的回调函数B,调用时,将服务程序运行中的数据作为回调函数参数传递给程序C,从而实现了服务程序与客户程序之间的通信。

2.回调函数在Android中的应用----Dialog与Activity之间的通信

在Android开发中会遇到这样的情况:Activity中激活了Dialog,在Dialog如果实现了对某个图片的选择,那么需要将图片的路径地址传递给Activity以告诉Activity选择了哪一张图片,这时候我们就可以用回调函数来实现了。

实现的过程如下:

(1)首先,我们需要定义一个接口,这个接口用于声明传输参数的类型,以及返回类型。在此以图片地址作为参数来,类型为String:

1 public interface DialogListener {
2     //获得图片地址的回调函数的接口函数
3     public void getImageAddr(String addr);
4 }

 

(2)自定义一个类MyDialog继承Dialog,在该类中定义一个将回调函数地址传入的方法setDialogListener(相当于对回调函数进行了注册),并在需要进行传输的地方对回调函数getImageAddr进行调用。调用函数是的参数就是需要传递给Activity的图片地址。

package haitun.textchat;

import haitun.Interface.DialogListener;
import haitun.pictureInfo.PictureInfo;
import haitun.sdcard.FileUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.app.Dialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.SimpleAdapter;
import android.widget.SimpleAdapter.ViewBinder;

public class MyDialog extends Dialog{
    Context context;
    DialogListener dialogListener=null;
    public MyDialog(Context context){
        super(context);
        this.context=context;
    }
    public MyDialog(Context context,int theme){
        super(context,theme);
        this.context=context;
    }
    /**********通过这个方法,将回调函数的地址传入到MyDialog中*********/
    public void setDialogListener(DialogListener listener){
        this.dialogListener=listener;
    }
    
    private GridView gridView=null;
    List<Bitmap> imageList=null;
    SimpleAdapter adapter=null;
    List<PictureInfo> picInfolist=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.picture);
        gridView=(GridView)findViewById(R.id.gridView);
        PictureInfo picInfo=new PictureInfo();
        FileUtils file=new FileUtils();
        picInfolist=file.getPictureFiles("haitun/picture");
        imageList=picInfo.getImageList(picInfolist);
        List<HashMap<String,Object>> listImage=new ArrayList<HashMap<String,Object>>();
        for (int i = 0; i < imageList.size(); i++) {
            HashMap<String, Object> map=new HashMap<String, Object>();
            map.put("itemImage",imageList.get(i));
            listImage.add(map);
        }
        String[] from=new String[]{"itemImage"};
        int[] to =new int[]{R.id.image_ItemImage};
        adapter=new SimpleAdapter(MyDialog.this.context,listImage, R.layout.cell, from,to);
        
        /************将图片和数据绑定*************/
        adapter.setViewBinder(new ViewBinder() {
            
            @Override
            public boolean setViewValue(View view, Object data,
                    String textRepresentation) {
                // TODO Auto-generated method stub
                if(view instanceof ImageView && data instanceof Bitmap){  
                    ImageView i = (ImageView)view;  
                    i.setImageBitmap((Bitmap) data);  
                    return true;  
                }  
                return false;
            }
        });
        gridView.setAdapter(adapter);
        gridView.setOnItemClickListener(listener);
    }
    /**************监听图片选择*************/
    OnItemClickListener listener=new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub
            dismiss();
            String addr=picInfolist.get(arg2).getPicFileName();//得到图片的路径地址
            System.out.println(""+addr);            
            dialogListener.getImageAddr(addr);  //传递图片地址的回调函数
        }

    };

}

(3)在Activity中完成对回调函数接口的实现,并接实现后的匿名内部类的作为参数传给setDilalogListener方法。这个接口实现后的内部内方法中会监听Dialog中的是否会调用该方法,当MyDialog中调用了该方法,就会将图片地址传过来,并执行回调函数中内容。

MyDialog dialog=new MyDialog(ChatActivity.this);
dialog.setDialogListener(dialogListener);
dialog.show();

DialogListener dialogListener=new DialogListener(){

        @Override
        public void getImageAddr(String addr) {
            // TODO Auto-generated method stub
       //一直等待被调用

       //作为参数传递进来的addr字符串就是图片地址
       Toast.makeText(ChatActivity.this,""+addr, Toast.LENGTH_SHORT).show(); Bitmap bitmap=BitmapFactory.decodeFile(addr); listViewUpdate(config.getUserName()+":", bitmap); } };


 

转载于:https://www.cnblogs.com/haitunzhulang/archive/2013/04/07/3003792.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值