android 回撥介面學習(自定義Dialog 獲取資料資料回撥)
阿新 • • 發佈:2019-01-29
功能:
將單獨的一個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);
}
});