iT邦幫忙

DAY 23
4

Android 學習手札系列 第 23

Day 23 - Android - 不要問我從哪裡來

  • 分享至 

  • xImage
  •  

不要問我從哪裡來~我的故鄉在遠方…唱歌
謎之音:「喂!~」
怕有人會接唱走就先唱出來了…
謎之音:「搞錯重點了吧!先說今天的重點啦!」
何去何從~
謎之音:「啊!?…」
偷笑
呈如一開始的那一句,在 Android 的世界裡,每個 Activity 皆有自己執行的生命週期,但是每個 Activity 之間誰執行到哪裡,誰返回上一頁結束時回到誰身上,亦或是說被重新啟動(onRestart)時,又是從誰接棒回來的~若是沒有需求時,「別問從何方來」是真的不會有什麼影響,可是,我們真想要知道是從哪個 Activity 回來、想要從不同地方回來的 Activity 獲得不同的資料時,得要怎麼處理,這就是今天的主題啦!

皆下來要麻煩各位直接抓下Day22_Menu的範例,在下稍微動了點手腳,除了 MoogleActivity 外,ChocoboActivity 以及 Moogle2Activity 在點下 menu 的清單按鈕時,都會將現階段的自己結束掉「finish()」。在這種狀況下,只要是從「清單頁」也就是從 Moogle3Activity 返回後,一律都會回到 MoogleActivity。大家可能會在心裡想,這樣有什麼關係嗎?就如第上一段所提到的觀點,我們若沒有想要做什麼事的話,這麼做的確是沒有什麼問題,但若是我們想讓 MoogleActivity 在接收不同地方所返回而有不同的反應時,得要怎麼做呢?

這個時候,我們就要回到這系列的主線任務啦~
謎之音:「這系列有主線任務哦!」
XD

那就麻煩大家取得昨天的範例之後,將之重新複製為「Day23_ReturnTo」吧!各位可以先執行看看,除了 MoogleActivity 外,其餘二者都在執行到 Moogle3Activity 之後會再回到自己的前一個 Activity 而不是自己,這時候就請各位先加入編號的物件。

先在將專案的 Package 上,點下新增圖示會開啟新增視窗,這時請選擇 Java 的 Class,會看到下面這個畫面

請確認目錄、Package是我們今天這個專案的位子,接著請在Name的欄位打上"Number"後結束,這時就會新增一個 Number.java 的檔案了!這時候我們先定義四個靜態常數:

public class Number {
	public static final int Chocobo = 0;
	public static final int MOOGLE = 1;
	public static final int MOOGLE2 = 2;
	public static final int MOOGLE3 = 3;
}

接著,請到Moogle3Activity的介面上加入一個按鈕,將按鈕設定名稱為"@+id/btn_moogle3_back",然後在 Moogel3Activity 定義以下的動作

//先宣告全域的物件
private Button mBtnBack;

定義偵聽式,這裡是一個重要的關鍵
setResult()是設定回傳的函式

private View.OnClickListener btnClick = new View.OnClickListener() {
    public void onClick(View v) {
        //這裡除了結束自己外還要設定回傳值
        setResult(Number.MOOGLE3);
            finish();
    }
};

給定物件並設定動作

    mBtnBack = (Button)findViewById(R.id.btn_moogle3_back);
    mBtnBack.setOnClickListener(btnClick);

再來,先從 MoogleActivity.java 的 Menu 動作來設定,整個區塊如下

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()){
        case R.id.menu_moogle:
            Intent intent = new Intent(this, Moogle3Activity.class);
            //startActivity(intent);
            //用startActivityForResult來取代之
            startActivityForResult(intent, Number.MOOGLE);
            break;
    }
    return super.onOptionsItemSelected(item);
}

startActivityForResult()是接收回傳值的啟動函式。
啟動函式、回傳函式準備好了,再來就是接收函式了!

@Override
protected void onActivityResult(
        int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch(resultCode){
        case Number.MOOGLE3:
            Toast.makeText(this, "看過清單了", Toast.LENGTH_SHORT).show();
            break;
    }
}

這邊只用到返回函式裡的一個"resultCode"值,這裡所接收的就是在Moogle3Activity.java裡所設定的setResult()函式裡的Number.MOOGLE3。如此一來,在Moogle3Activity這裡按下返回按鈕後,回來到MoogleActivity就會從startActivityForResult開始啦!

今天就簡單地為各位做這樣的說明,明天我們再來針對 Chocobo 以及 Moogle2 來玩一些互動吧^_^

Day 22 - Android - 任意門《 》Day 24 - Android - 溝通


上一篇
Day 22 - Android - 任意門
下一篇
Day 24 - Android - 溝通
系列文
Android 學習手札30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
ted99tw
iT邦高手 1 級 ‧ 2012-12-20 15:59:01

讚,裝甲軍繼續往前推進,衝呀!!忙

我要留言

立即登入留言