android利用回撥函式在對話方塊中傳遞資料
android開發中,往往需要在當前activity中開啟一個輸入框來獲取使用者資料,但是怎麼將輸入框的資料傳遞到activity中呢?
一種方法是建立一個全域性變數,在對話方塊中將資料傳遞給靜態全域性變數,然後在當前activity中使用它。這種方式繁瑣而且不待見,因為靜態全域性變數是一直存在的,處理不好會發生很多問題。
另一種方式就是使用回撥函式將資料傳遞回來。
先來看看效果圖:
沒有資料之前:
開啟輸入對話方塊並往對話方塊中輸入資料:
然後按下輸入框中的確定按鈕,就將資料傳遞給了開啟它的activity:
這裡的回撥函式,其實就是對對話方塊進行監聽,這裡的監聽就是回撥函式。當對話方塊完成資料的輸入後,回撥函式會將資料自動傳回到對對話方塊進行監聽的activity中。這樣就實現了資料的共享和傳遞。要實現這樣的回撥函式很簡單,只要定義一個介面,接口裡定義一個獲取資料的函式就可以了。
具體程式碼如下:
首先定義簡單的佈局:
activity的佈局和輸入框的佈局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".DialogActivity">
<EditText
android:id ="@+id/showResult"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/start"
android:text="StartActivity"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout >
這裡只使用了一個EditText文字框,用來顯示從對話方塊傳來的資料,一個Button按鈕,用來開啟對話方塊。
接著是自定義對話方塊的佈局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/edit"
android:layout_width="200dp"
android:layout_height="wrap_content" />
<Button
android:layout_width="80dp"
android:layout_height="60dp"
android:id="@+id/sure"
android:text="Sure"/>
</LinearLayout>
自定義對話方塊的佈局也比較簡單,一個EditText用來輸入資料,一個Button確定按鈕。
接著在實現自定義對話方塊的類,這裡為了方便,將介面定義在類裡面,也可以將介面單獨定義。
/**
* Created by mhwang on 2015/11/18.
*/
public class MyDialog extends Dialog {
//定義介面
public interface DataBackListener{
public void getData(String data);
}
private EditText editText;
private Button btnSure;
DataBackListener listener; //建立監聽物件
public MyDialog(Context context, final DataBackListener listener) {
super(context);
//用傳遞過來的監聽器來初始化
this.listener = listener;
setContentView(R.layout.dialog);
editText = (EditText)findViewById(R.id.edit);
btnSure = (Button)findViewById(R.id.sure);
btnSure.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String str = editText.getText().toString();
//這裡呼叫介面,將資料傳遞出去。
listener.getData(str);
dismiss();
}
});
}
}
最後在activity中建立對話方塊並監聽。
public class DialogActivity extends Activity {
EditText showResult;
Button btnStartDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dialog);
showResult = (EditText)findViewById(R.id.showResult);
btnStartDialog = (Button)findViewById(R.id.start);
btnStartDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//建立對話方塊物件的時候對對話方塊進行監聽
MyDialog dialog = new MyDialog(DialogActivity.this,
new MyDialog.DataBackListener() {
@Override
public void getData(String data) {
String result = data;
showResult.setText(result);
}
});
dialog.show();
}
});
}
很簡單的,就是通過介面將activity和dialog關聯起來,然後共享資料。
相關推薦
android利用回撥函式在對話方塊中傳遞資料
android開發中,往往需要在當前activity中開啟一個輸入框來獲取使用者資料,但是怎麼將輸入框的資料傳遞到activity中呢? 一種方法是建立一個全域性變數,在對話方塊中將資料傳遞給靜態全域性變數,然後在當前activity中使用它。這種方式繁瑣而且
android 如何在自定義對話方塊中獲取edittext中的資料
在專案中忽然遇到這樣的問題,需要自定義對話方塊,對話方塊需要有一個輸入框,以便修改所選中的價格,然後點選確定之後,修改所顯示的價格。遇到的最大的問題就是如何能夠獲取到自定義對話方塊當中edittext輸入的數值,百度了很久,看到的答案都是如下: //得到自定義對話方塊
Android 抽象回撥函式以及介面回撥更新UI
回撥函式使用,使得程式碼變得部分跟不變部分更加明顯,程式碼整體上有一個質的提升。 我是用抽象類裡寫的抽象回撥函式,通過通知註冊介面形式,可以隨時傳遞資料,接受資料。 同時我用介面函式回撥更新UI。下面
c的回撥函式與java中抽象函式,介面函式,抽象類簡單理解
先了解c語言的回撥函式,舉個簡單例項步步深入,比如A程式提供給B程式使用,但是A想要呼叫B的程式碼,這樣各自不同功能由B實現即可。 例項1A: extern int get_B_data(); void A_data_handle(){ printf("%d\n",get
javascript利用回撥函式解決非同步困擾
雖然已經存在promise,StratifiedJS等工具用來解決回撥地獄,但是講真,我覺得他們也並沒有讓程式碼的可讀性大大增強,而且在回撥函式的巢狀次數有限的情況下也不至於成為一個“地獄”,所以筆者還是老老實實的繼續啃這塊js裡的板磚——利用回撥函式解決javascrip
highcharts座標軸標籤格式化回撥函式formatter:function中引用series中的資料
今天用 highcharts 做個蛛網圖,想將y列資料顯示在x軸標籤後面,但是沒在X軸定義函式裡面獲取過y列的資料,找不到資料,只好自己摸索,後來配合console.log()終於找到正確的方法了。 先查到試了些,chart.series[0].data[0].point.
vc++ 不同對話方塊中傳遞資訊的方法(基於自定義訊息SendMessage)
也是花了一天時間才搞定的。 背景: 新建了一個基於對話方塊的MFC程式,在主對話方塊中新增tabcontrol控制元件,又新建了兩個Dialog(CDialog1和CDialog2),將它們設為tabcontrol控制元件的子對話方塊。 目的: 兩個子對話方塊之間傳遞訊息,子對話方塊與主對話
Android如何回撥編碼後的音視訊資料
有開發者提到,在推送RTMP推送端的基礎上,希望能回撥編碼後的音視訊資料,便於開發者對接第三方系統,如GB28181. 為此,我們加了一下介面: 1. 設定音視訊callback 對應介面: /** * Set Audio Encoded Data Callba
結合Dialog的onClick()事件理解Android中的回撥函式三部曲
App都少不了的一個需求,那就是Dialog彈窗,而且通常一個應用中都不止一個Dialog彈窗,多的時候可能達到六七個,那麼你是否會為你的應用重複寫六七個彈窗:ExitLoginDialog、DownDialog、UpdateDialog……如果是使用系統的Dialog還好,可以直接new一個
如何寫JavaScript中的callback回撥函式
如何寫回調函式? 如果自己在寫一個方法或函式,你有可能會遇到需要一個回撥函式。下面就是一個簡單的常見回撥函式例子: function mySandwich(param1, param2, callback) { alert('Started eating my
nodejs request模組使用promise 返回回撥函式中的值
var request = require('request'); //exports.httprequest = (requestData) =>{ function httprequest(requestData){ return new Promise((resolve, rejec
JS中回撥函式(一)
一.前奏 多用在使用 js 寫元件時,尤其是元件的事件很多都需要回調函式的支援 假設 A是回撥函式,B是呼叫者,B引數裡一個是指向A的函式指標,即回撥A,同時另外的引數傳遞給A作為引數 二.JS中函式可作為引數傳遞,甚至在另一個函式內部返回 一旦作為引數
詳解React中setState回撥函式
使用React過程中,中可以使用this.state來訪問需要的某些狀態,但是需要更新或者修改state時,一般而言,我們都會使用setState()函式,從而達到更新state的目的,setState()函式執行會觸發頁面重新渲染UI。但是呢,setState是非同步的!這就難
C++中 執行緒函式為靜態函式 及 類成員函式作為回撥函式
執行緒函式為靜態函式: 執行緒控制函式和是不是靜態函式沒關係,靜態函式是在構造中分配的地址空間,只有在析構時才釋放也就是全域性的東西,不管執行緒是否執行,靜態函式的地址是不變的,並不在執行緒堆疊中static只是起了一個裝飾的作用,所以二者並沒有必然的關係 執行緒也是一種
前端全棧工程化開發專題 — JS中回撥函式的深入解讀
1、回撥函式核心原理分析 js中的定時器及動畫 完整版動畫庫封裝 回撥函式初步講解 擴充套件更多的運動方式(非勻速) options物件引數的應用 ... 什麼是回撥函式? 把一個函式當做實參值傳遞給函式的形參變數(或者傳遞給函式,通過函式arguments獲取),在另外一個函
python Scrapy的spider中回撥函式的引數傳遞方法
通常有兩種方法,一種是使用meta進行引數傳遞。另一種是使用lambda進行引數傳遞。 方法一: 使用meta進行引數傳遞。 舉例如下: from scrapy.spiders import S
20181209——JS中的回撥函式
字面上的理解,回撥函式就是一個引數,將這個函式作為引數傳到另一個函式裡面,當那個函式執行完之後,再執行傳進去的這個函式。這個過程就叫做回撥。 其實也很好理解對吧,回撥,回撥,就是回頭呼叫的意思。主函式的事先幹完,回頭再呼叫傳進來的那個函式。但是以前看過很多部落格,他們總是將回調函式解釋
js中的回撥函式callback
前言其實我一直很困惑關於js 中的callback,困惑的原因是,學習中這塊看的資料少,但是平時又經常見,偶爾複製一下前人程式碼,功能實現了也就不再去追其原由,這麼著,這個callback的概念就越來越混亂,因為你總感覺它是你Ajax請求後呼叫的那個函式,又感覺它是你某一個函式中的形
對js中回撥函式的理解
一、什麼是回撥函式 一直接觸回撥函式這個名詞,但是不知道具體是幹什麼的,今天在百度上看到了一句話讓對回撥函式產生了一點興趣,那就是回撥函式的英文解釋: A callback is a function that is passed as an argument to an
[js]利用閉包向post回撥函式傳引數
最近在閒逛校園XX站的時候,打算搞個破壞,試試有多少人還是用初始密碼登陸。比較懶,所以直接開啟控制檯來寫。 所以問題可以描述為: 向後端不斷的post資料,id從1~5000自增,後端會根據情況來返回值res,需要把res=100的id輸出。