每個招式都有其連貫性,在一個勇者初蒞臨一個新的地圖時,最怕的就是接踵而來的怪物大軍,這個時考驗著身為勇者的主角有無足夠的體力、能力、恢復道具來面臨之。
因此,看穿接踵而來的大軍是否有無其次第或亂無章法,自然就是考驗著各位勇者的功力啦!
所謂知己知彼,百戰不殆,因此,我們就要來了解一下activity之間是如何做到溝通,使之能夠一個帶過一個的瀕臨,這樣才能在未來容易掌握一個基礎的脈絡。
(轉得好硬)
開始之前,先來個前言,在前幾天的文章中,所說明的內容都是以一個專案視為一個怪,後來想想似乎不是很妥當XD,因此,從今天開始打算重新定義一下,同時也是未來幾天的共識,有種會被揍的感覺
有了共識之後,我們就開始今天的主題啦~
每個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 去下載哦
對我來講
已經開始有點難度了
一開始加入Moogle2Activity時
發現Moogle2Activity.java會在Default package
而不是和Moogle1Activity.java在同一個我指定的package
以為自已漏掉了什麼步驟
整個刪掉重來了幾次
後來才發現可以手動將.java拉到另一個package
接著出現XML not well-formed的錯誤
跟Github上的source比對之後
才發現我之前刪掉重來的動作並沒有「百分之百」的刪除
造成manifest.xml中有些element重覆出現
這不知道是eclipse的問題還是我的
反正就是錯了就是了
Debug了半天
終於交作業了
雙修真辛苦...
真是用功
不過您提到的問題,因為沒有看到原始問題,所以只能大略地猜測是這樣的狀況
因為您將java檔移至不同的package去,而在manifest裡面的這段
<pre class="c" name="code">
<activity android:name="xxx">
會被保留在原路徑上,這時移除他,在mainfest這裡一樣會被保留
然後您又在這時新增一個同名的activity時,SDK就會幫我們在mainfest中再加入同樣的acitivty標籤,導致同名的狀況發生
給您參考~
補充一下,會被保留的原因是因為,在刪除時,SDK已經找不到同路徑檔案的標籤了,所以mainfest裡的這個標籤會被保留下來
我覺得應該就是您說的原因吧
iT邦幫忙MVPantijava提到:
雙修真辛苦...