回調函數實現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); } };


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM