1. 程式人生 > >android 回撥介面學習(自定義Dialog 獲取資料資料回撥)

android 回撥介面學習(自定義Dialog 獲取資料資料回撥)

功能:

將單獨的一個Dialog提取出來以複用程式碼,然後在activity中去new 一個Dialog出來,能夠獲取Dialog選取的資料;

具體實現

TopicSingleChoiceDialog.java

 private int topicID=-1;//真正要獲取的資料

自定義內部類介面

 public interface OnTestListening{
         void getTopicID(int topicID);
    }

內部變數

 private OnTestListening onTestListening;

類實現點選按鈕監聽器(就是我們點選了該按鈕後,activity將回調 獲取資料)

public class TopicSingleChoiceDialog extends AlertDialog.Builder implements DialogInterface.OnClickListener {

具體怎麼做呢,
讓該按鈕先繫結該監聽器

this.setPositiveButton("確定", this);

監聽器具體實現

  @Override
    public void onClick(DialogInterface dialogInterface, int i) {
        onTestListening.getTopicID(topicID);
    }

即等價於

this.setPositiveButton("確定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                onTestListening.getTopicID(topicID);
            }
        });

但是由於onTestListening在內部類,onTestListening要final,而interface的onTestListening是不能被final的(貌似是這樣),最後採用上面的方法 讓TopicSingleChoiceDialog 去實現介面

那麼到這裡後,當點選確定按鈕後,就會執行 onTestListening.getTopicID(topicID);
那麼 我們只要在activity中例項化dialog(Context cx,new TopicSingleChoiceDialog.OnTestListening())
例如:

TopicSingleChoiceDialog topicSingleleChoiceDialog =new TopicSingleChoiceDialog(ct, new TopicSingleChoiceDialog.OnTestListening() {
                        @Override
                        public void getTopicID(int topicID) {
                            Log.i("zjx","topicID:"+topicID);
                        }
                    });

便可以獲取到我們要的topicID

當然 對於複雜資料 ,只要將getTopicID中的引數改為Bundle 或者map等即可
完整程式碼:

package com.france.sharereader.ui.view;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.widget.Toast;

/**
 * Created by Administrator on 2015/11/15.
 */
public class TopicSingleChoiceDialog extends AlertDialog.Builder implements DialogInterface.OnClickListener {
    private int topicID=-1;//真正要獲取的資料
    private OnTestListening onTestListening;
    public TopicSingleChoiceDialog(Context context,OnTestListening onTestListening) {
        super(context);
        this.onTestListening=onTestListening;
        this.setTitle("選擇所屬話題");
        final String[] hobbies = {"編譯原理", "軟體工程", "資料探勘", "電子設計"};
        //    設定一個單項選擇下拉框
        /**
         * 第一個引數指定我們要顯示的一組下拉多選框的資料集合
         * 第二個引數代表哪幾個選項被選擇,如果是null,則表示一個都不選擇,如果希望指定哪一個多選選項框被選擇,
         * 需要傳遞一個boolean[]陣列進去,其長度要和第一個引數的長度相同,例如 {true, false, false, true};
         * 第三個引數給每一個多選項繫結一個監聽器
         */
        this.setSingleChoiceItems(hobbies, 0, new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                setTopicID(which);
            }
        });
        this.setPositiveButton("確定", this);
        this.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });

        this.show();
    }
    public interface OnTestListening{
         void getTopicID(int topicID);
    }


    public void setTopicID(int topicID) {
        this.topicID = topicID;
    }

    @Override
    public void onClick(DialogInterface dialogInterface, int i) {
        onTestListening.getTopicID(topicID);
    }
}

activity中:

TopicSingleChoiceDialog topicSingleleChoiceDialog =new TopicSingleChoiceDialog(ct, new TopicSingleChoiceDialog.OnTestListening() {
                        @Override
                        public void getTopicID(int topicID) {
                            Log.i("zjx","topicID:"+topicID);
                        }
                    });