1. 程式人生 > >android利用回撥函式在對話方塊中傳遞資料

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中函式可作為引數傳遞,甚至在另一個函式內部返回 一旦作為引數

詳解ReactsetState函式

使用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輸出。