利用Android回調機制對Dialog進行簡單封裝

ChristinaQf 8年前發布 | 8K 次閱讀 安卓開發 Android開發 移動開發

寫作原因:Android回調機制是Android開發者繞不開的一個點,對于它的掌握學習十分重要。本文由于作者水平有限可能存在紕漏,對于回調機制的學習掌握仍在途中,以后會推出更多的相關文章。

簡介

接口回調是Android中一種常用的機制,如Button點擊事件就是接口回調的具體實現。Fragment與Activity之間的通信機制也是基于接口回調實現,感興趣的可以閱讀博主上篇關于Fragment通信的文章(基于Google官方文檔):Fragment間的通信。對于接口回調,作為初學者,個人有一下的一點認識:我們可以把接口看作是一個呼叫端口,是在某個功能類(發送方)完成自身功能過程中觸發某些動作時通過接口中的某一個方法呼叫接口,然后接口將這種呼叫傳至實現該接口的類(接收處理方)中,該類通過實現回調方法對該呼叫作出反饋。下面是Wikipedia上面關于回調機制的定義,有興趣可以看看。

In computer programming, a callback is a piece of executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at some convenient time. The invocation may be immediate as in a synchronous callback, or it might happen at a later time as in an asynchronous callback. In all cases, the intention is to specify a function or subroutine as an entity that is, depending on the language, more or less similar to a variable.

實現

實現代碼是最好的學習方式,下面博主通過封裝一個簡單的Dialog來講解接口回調的具體用法。平常使用Dialog時如果按照標準寫法來有時會顯得很繁瑣,博主因為特定需要將其封裝成一個只有message和“確定”,“取消”按鈕點擊事件的工具。下面我將按照步驟一步步實現:

定義接口

在簡介中已經說過,接口是一個呼叫端口,是通信的中介。內部的方法類比為不同請求。的本例中的接口是在我們點擊Positive Button和Negative Button時被呼叫的。所以定義一下的接口:

public interface onButtonClick{
        public void OnPositive();
        public void OnNegative();
    }

上面的接口中有兩個方法,分別在點擊Positive Button和Negative Button時回調

實現接口

這包括兩個部分,一個是在功能類(發送方)向接口發出呼叫時實現回調:
先創建回調對象mCallBack:
private onButtonClick mButtonClickCallBack;
然后在觸發某個動作時(當點擊Dialog上的按鈕時)發出回調(呼叫接口):

builderSec.setPositiveButton("確定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

                mButtonClickCallBack.OnPositive();
            }
        });
        builderSec.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mButtonClickCallBack.OnNegative();
            }
        });

在另一個類(接收處理方)中實現回調方法對該呼叫作出反饋:
先實現該接口,可以在功能類中定義以下方法:

public void setOnButtonClick(onButtonClick mNegativeCallBack) {
        this.mButtonClickCallBack = mNegativeCallBack;
    }
MyDialog deleteDialog = new MyDialog(getActivity(),"RTGBrowser","是否刪除當前歷史記錄?");
                deleteDialog.setOnButtonClick(new MyDialog.onButtonClick() {
                    @Override
                    public void OnPositive() {
                        //TODO:在這里實現點擊Positive按鈕的邏輯;
                    }
                    @Override
                    public void OnNegative() {
                        //TODO:在這里實現點擊Negative按鈕的邏輯;
                    }
                });

這樣就通過接口回調實現對一個Dialog進行封裝,下面貼出完整的代碼:

源碼

MyDialog.class

package com.example.vincebarry.exam.function;
import android.content.Context;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;

/**
 * Created by VinceBarry on 2016/5/2.
 * 那現在一起來總結一下基本的回調是如何實現的,首先創建一個接口,這個接口用于你在某個情景下執行相應的操作。
 * 接著創建一個功能類,比如這個類可以顯示一個對話框、可以滑動菜單、可以下載數據等等。
 * 然后,在這個類里面聲明回調接口的對象,之后在這個類里面創建在某個情景下需要執行的方法,而且在這個方法里面為聲明的接口對象賦值。
 * 最后在其他的類中使用這個功能類就可以了。所以說,最少也是需要三個類共同來完成這個回調機制。
 */
public class MyDialog {
    private onButtonClick mButtonClickCallBack;
    private Context context;
    private String title;
    private String message;
    AlertDialog.Builder builderSec;
    public interface onButtonClick{
        public void OnPositive();
        public void OnNegative();
    }
    public MyDialog(Context context,String title,String message){
        this.context = context;
        this.title = title;
        this.message = message;
        builderSec = new AlertDialog.Builder(context);
        builderSec.setTitle(title);
        builderSec.setMessage(message);
        builderSec.setPositiveButton("確定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

                mButtonClickCallBack.OnPositive();
            }
        });
        builderSec.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mButtonClickCallBack.OnNegative();
            }
        });
        AlertDialog dialogSec = builderSec.show();
    }

    public void setOnButtonClick(onButtonClick mNegativeCallBack) {
        this.mButtonClickCallBack = mNegativeCallBack;
    }

}

MainActivity.class

MyDialog deleteDialog = new MyDialog(getActivity(),"RTGBrowser","是否刪除當前歷史記錄?");
                deleteDialog.setOnButtonClick(new MyDialog.onButtonClick() {
                    @Override
                    public void OnPositive() {
                        DataSupport.delete(TableHistoryLocal.class,positionInDb);
                        queryAndTrans();
                        roadData();
                    }
                    @Override
                    public void OnNegative() {
                        //donothing.
                    }
                });

水平不足,存在紕漏或錯誤請指教!!

 

閱讀原文

 

 本文由用戶 ChristinaQf 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!