iT邦幫忙

DAY 6
6

Android 學習手札系列 第 6

Day 6 - Android - 串連

  • 分享至 

  • xImage
  •  

每個招式都有其連貫性,在一個勇者初蒞臨一個新的地圖時,最怕的就是接踵而來的怪物大軍,這個時考驗著身為勇者的主角有無足夠的體力、能力、恢復道具來面臨之。
因此,看穿接踵而來的大軍是否有無其次第或亂無章法,自然就是考驗著各位勇者的功力啦!
所謂知己知彼,百戰不殆,因此,我們就要來了解一下activity之間是如何做到溝通,使之能夠一個帶過一個的瀕臨,這樣才能在未來容易掌握一個基礎的脈絡。
(轉得好硬無言)
開始之前,先來個前言,在前幾天的文章中,所說明的內容都是以一個專案視為一個怪,後來想想似乎不是很妥當XD,因此,從今天開始打算重新定義一下,同時也是未來幾天的共識,有種會被揍的感覺汗

  1. Android的世界
    在昨天已經知道了,我們所處的應用層是屬於android世界中的一小世界,所以未來我們所說明的 Android 世界所指的就是應用層的世界,這是於未來說明的第一個共識。
    2.專案(Project)
    就當作世界中的某塊”大陸”,而我們所在這裡建立的一切與一切的都落在這個大陸之上。
    3.[.java]檔
    這個遍佈的會比較廣,因為有時他為是一個activity,有時他會是一個單純的物件module,有時會是一個帶動作的物件功能,因此,就隨機應變,建立我們想要建立的吧。

有了共識之後,我們就開始今天的主題啦~

每個APP裡一定不是只有一個 activity 在執行,那這時候問題來了,在多個 activity 的情況下,我們要如何讓他從第一個 activity 切換到第二個 activity 外,就如同在一開始的簡介說明的,怪物大軍接踵而來,他們怎麼一個通知一個,要不要抄傢伙來攻擊,若是我們能夠了解這個脈絡,未來登陸到一個複雜的大陸上,我們也能夠很快速的得知,每個怪是如何連繫的,以及他們是如何互通有無。
在 android 的世界中,每個 activity 之間都溝通模式稱之為 intent,中文翻譯成意圖,這就好比海豚以及蝙蝠是用音波、人與 E.T. 是用手指(咦)的關係,那就麻煩各位開啟這塊新大陸 - Intent:

今天我們來遭遇一個比較不同的種族-モーグリ(Moogle,出場作品Final Fantasy3),請注意這邊,在介面的定義的部份我們要改兩個欄位名稱:Activity Name以及Title

既然是要溝通,自然要有兩隻モーグリ才行嘛,所以緊接著建立第二支activity,按下右上角圖示工具列的NEW按鈕,選擇**"Android Activity"**,然後跟上面一樣,將介面的兩個欄位分別改為Moogle2Activity以及Moogle2。
再來請仿照Day4的動作,將原本介面上的 Hello World 文字改成 button,而 Moogle1 的 button 請分別將屬性 id 以及 text 改成"@+id/btn_call_moogle2"以及"請求支援"

而 Moogle2 的 button 請同樣改該兩個屬性為"@+id/btn_request"以及"我來也!"

完成介面的設計之後,我們就開始定義該按鈕的動作了,還記得要讓button動起來的程式結構嗎?若是忘了請移架到Day4去看哦(怕字數放不下),而我們這篇就要直接針對button的動作定義了!

        Button btnCallMoogle2 = (Button)findViewById(R.id.btn_call_moogle2);
        btnCallMoogle2.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				/* TODO: 被點擊後要執行的動作 */
			}
		});

而基本的 Intent 語法解構很簡單

//產生一個 intent 物件,建構函式的參數有二,
//前者為自己,後者為目標對象,意即「從這裡切換到那裡」的語法。
Intent intent = new Intent(自己, 目標);
//然後開始切換,參數就是上述所定義的新物件
startActivity(intent);

而同樣的,在Moogle2寫下同樣的動作,程式碼分別如下
Moogle1Activity

        Button btnCallMoogle2 = (Button)findViewById(R.id.btn_call_moogle2);
        btnCallMoogle2.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				/* TODO: 被點擊後要執行的動作 */
				Intent intent = new Intent(Moogle1Activity.this, Moogle2Activity.class);
				startActivity(intent);
			}
		});

Moogle2Activity

        Button btnRequestToMoogle1 = (Button)findViewById(R.id.btn_request);
        btnRequestToMoogle1.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				/* TODO: 被點擊後要執行的動作 */
				Intent intent = new Intent(Moogle2Activity.this, Moogle1Activity.class);
				startActivity(intent);
			}
		});

以上是 Intent 的基本式!完整的程式碼請到 Mosil 的 GitHub 去下載哦沙發

《世界的元素 傳遞訊息用的包裹》


上一篇
Day 5 - Android - 世界的元素
下一篇
Day 7 - Android - 傳遞訊息用的包裹
系列文
Android 學習手札30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
海綿寶寶
iT邦大神 1 級 ‧ 2012-10-01 10:36:15

對我來講
已經開始有點難度了
落寞

一開始加入Moogle2Activity時
發現Moogle2Activity.java會在Default package
而不是和Moogle1Activity.java在同一個我指定的package
以為自已漏掉了什麼步驟
整個刪掉重來了幾次
後來才發現可以手動將.java拉到另一個package

接著出現XML not well-formed的錯誤
跟Github上的source比對之後
才發現我之前刪掉重來的動作並沒有「百分之百」的刪除
造成manifest.xml中有些element重覆出現
這不知道是eclipse的問題還是我的
反正就是錯了就是了

Debug了半天
終於交作業了
雙修真辛苦...


看更多先前的回應...收起先前的回應...
mosil iT邦新手 4 級 ‧ 2012-10-01 12:23:00 檢舉

真是用功簽名

不過您提到的問題,因為沒有看到原始問題,所以只能大略地猜測是這樣的狀況
因為您將java檔移至不同的package去,而在manifest裡面的這段

<pre class="c" name="code">
<activity android:name="xxx">

會被保留在原路徑上,這時移除他,在mainfest這裡一樣會被保留
然後您又在這時新增一個同名的activity時,SDK就會幫我們在mainfest中再加入同樣的acitivty標籤,導致同名的狀況發生

給您參考~

mosil iT邦新手 4 級 ‧ 2012-10-01 12:24:31 檢舉

補充一下,會被保留的原因是因為,在刪除時,SDK已經找不到同路徑檔案的標籤了,所以mainfest裡的這個標籤會被保留下來

我覺得應該就是您說的原因吧
謝謝

鐵殼心 iT邦高手 1 級 ‧ 2012-10-01 14:53:49 檢舉

iT邦幫忙MVPantijava提到:
雙修真辛苦...

灑花

0
ted99tw
iT邦高手 1 級 ‧ 2012-12-19 23:29:50

雙修的確辛苦,不像我在鐵人賽落幕頒獎完並大吃大喝飽餐一頓後,才真正要坐下來慢慢享用小綠人...開心

我要留言

立即登入留言