天天看點

《Android 開發入門與實戰(第二版)》——6.9節Activity小執行個體

本節書摘來自異步社群《android 開發入門與實戰(第二版)》一書中的第6章,第6.9節activity小執行個體,作者eoe移動開發者社群 組編 , 姚尚朗 , 靳岩,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

6.9 activity小執行個體

android 開發入門與實戰(第二版)

在介紹完activity相關基礎内容後,現在我們來針對activity開發一個簡單的小執行個體。

這個執行個體指定了3個界面(activity)。helloworldactivity界面有兩個按鈕,button 1和button 2(見圖6-3),button 1單擊後會跳轉到activity b,而activity b簡單地顯示“this is activity b,welcome!”(見圖6-4)。單擊button 2後則跳轉到activity c,activity c界面有一個輸入框以及一個“确定”按鈕(見圖6-5),當單擊“确定”按鈕之後,将關閉activity c,并擷取輸入框中的内容,回傳到helloworldactivity,并将回傳的内容顯示在button2的下方,如圖6-6所示。

《Android 開發入門與實戰(第二版)》——6.9節Activity小執行個體

第x問1 執行個體程式設計實作

第1步:建立一個android項目(相信大家看完前面的章節已經知道如何去建立一個android項目了,這裡就不再贅述),并建立包名,3個activity(全部繼承自activity類,并重寫oncreate方法)以及3個布局檔案。如圖6-7所示。

《Android 開發入門與實戰(第二版)》——6.9節Activity小執行個體

第2步:打開main.xml布局檔案,編寫如下代碼。

定義一個linearlayout(線性布局),并在這個布局中定義兩個button和一個textview控件。兩個button的長和寬都是wrap_content(包裹住内容)就可以了。textview的寬度則是fill_parent(填滿父控件)。

注意

上述代碼中的button控件的android:text屬性的值理應放置在項目結構中values檔案夾下strings.xml檔案中定義,并采用@string/xxx來引用對應的值。由于這裡主要是介紹activity,是以就直接将值寫在了屬性後面。

第3步:打開activityb.xml布局檔案,編寫如下代碼。

定義一個線性布局,并在布局中定義一個edittext和button控件。

第5步:打開helloworldactivity.java檔案,找到oncreate方法,編寫如下代碼。

helloworldactivity首先将main.xml檔案設定為布局檔案,之後通過findviewbyid方法得到兩個button控件,由于先打算實作單擊button1跳轉到activityb這個功能,我們暫時隻為button1綁定單擊事件。

語句建立了一個intent,這個intent描述了從helloworldactivity跳轉到activityb的一次操作。

startactivity(_intent)語句用來啟動_intent,由_intent描述的這次操作才正式執行。

小知識

什麼是intent?在android官方文檔中是這麼定義的,intent是一次即将操作的抽象描述,現在了解這個定義還有些抽象,但是看完本書就會對這個定義了解了。在android當中,一共用到了3種intent,現在使用的是第一種,它的作用就是啟動一個新的activity并且可以攜帶資料。還有兩種分别如下:

(1)通過intent啟動一個服務(service)。

(2)通過intent廣播事件。

以上兩種我們會在後續的章節講到,這裡不再細述。

第6步:打開activityb.java檔案,這個檔案中沒有複雜的代碼,隻是将activityb.xml檔案設定為activityb的布局檔案。具體代碼如下。

通過這一步之後,從helloworldactivity跳轉到activityb就已經完全實作了。接下來就要實作稍微複雜一點的從helloworldactivity跳轉到activityc,并得到傳回值顯示在helloworldactivity的邏輯了。

第7步:重新打開helloworldactivity.java并為button2添加監聽事件,具體代碼如下。

intent _intent =new intent(helloworldactivity.this,activityc.class)跟button1一緻,也是描述一次從helloworldactivity到activityc的跳轉操作。不同的是,這次啟動時,使用的方法是startactivityforresult()方法。

上述代碼中的startactivityforresult方法有兩個參數,第一個是intent對象,還有一個則是“請求碼”(requestcode),這個請求碼是用來區分不同的請求。

例如,a activity使用了startactivityforresult方法啟動了b activity以及c activity,在回調的時候,a activity中的回調方法隻有一個,這樣,我們就能夠根據不同的requestcode在不同的時機隻取b activity或c activity傳回的值。

startactivity在啟動了其他activity之後是不會再回調回來的,相當于啟動者與被啟動者在啟動完畢之後是沒有關系的。

startactivityforresult在啟動了其他activity之後是有回調的,也就是說啟動者與被啟動者在啟動完畢之後依然是有關系的。

第8步:前面我們已經在helloworldactivity中為button2添加了事件并使用startactivityforresult來啟動activityc,現在我們看看activityc又需要做些什麼呢?關鍵代碼如下所示:

從上面的代碼注釋中也能了解到,先是擷取了edittext這個控件對象,并使用edittext.gettext().tostring()得到edittext中輸入的值,再通過intent的putextra方法将擷取的值以鍵值對的形式存入intent中,之後調用setresult方法将成功的狀态碼以及intent對象傳到父activity(helloworldactivity)中。

小知識1

intent在傳遞資料時提供了putextra和對應的getextra方法來實作存值與取值。而這裡的put和get方法其實和bundle的put,get方法是一一對應的。在intent類中有一個bundle的mextras成員變量,所有的putextra和getextra方法實際上都是調用mextras對象的put和get方法進行存取。是以,在正常情況下,傳遞資料可以直接使用intent的putextra和getextra方法即可,無需再建立一個bundle對象。

小知識2

bundle類型。這裡簡單介紹一下,bundle是一個類型安全的容器,它的實作就是對hashmap做了一層封裝。對于hashmap來說,任何鍵值對都可以存進去,值可以是任何的java對象。但是對于bundle來說,同樣是存鍵值對,但是這個值隻能是基本類型,或者基本類型數組,比如int,byte,boolean,char等。

如果大家對bundle的概念還是有點模糊,沒關系,在以後的學習過程中會慢慢了解,這裡隻需要知道,我們可以使用intent對象的putextra和getextra方法來存取資料就行了。

第 9 步:在完成了activity c.java檔案的代碼編寫後,我們接着再繼續打開helloworldactivity檔案,最開始,我們在helloworldactivity中實作了button 2的事件,這個事件啟動了對activity c的調用,而在activity c中我們剛剛也得到了一個edittext對象的值并通過setresult方法回傳到了父activity(helloworldactivity),那麼現在我們就需要在helloworldactivity中來實作我們的回調函數了。具體代碼如下。

if(requestcode == 100 && resultcode == activity.result_ok)這句代碼是判斷requestcode是不是等于當初你在startactivityforresult方法中設定的requestcode,并且activityc傳回的resultcode是不是等于resultok_,如果是,則通過data.getextras().getstring("helloworld")擷取activityc中通過putextra方法存的值。得到值之後,再擷取main.xml布局檔案中的textview控件,并将值賦給它顯示出來。

第 10 步:這也是最容易被忽視的一步,我們所有的activity都必須在androidmanifest.xml檔案中進行注冊,如果不注冊,程式将會出錯。具體注冊代碼如下。

注冊完畢之後,整個執行個體就完成了,趕緊運作試試看吧!

繼續閱讀