昨天我們已經瞭解了 Activity 的生命週期,同時也有提到 onCreate 這個 Callback Method 會在 Activity 被建立時首先被呼叫,由於其在生命週期的過程中只會被呼叫一次,因此我們通常會在 onCreate 做靜態的初始化,例如介面元件 (View) 的初始化,今天將詳細說明 onCreate 裡的內容:
(由於10月7日後 iT邦幫忙的編輯/閱讀器才會幫程式碼加上行數,請讀者以筆者的行數為主)
11 @Override
12 protected void onCreate(Bundle savedInstanceState) {
13 super.onCreate(savedInstanceState);
14 setContentView(R.layout.activity_calendar);
15 }
首先第 13 行,程式呼叫父類別的 onCreate,以便確保父類別所做的初始化都有做到,以我們的程式為例,當讀者開啓 ActionBarActivity 的說明文件 [1] 時,會於類別名稱的旁邊看到 (view source) 和 (sample code),如下圖所示:
當我們點擊 (view source) 後就可以看到 ActionBarActivity 的原始碼,利用搜尋關鍵字「onCreate」,可在 94 ~ 99 行發現 onCreate 的內容,如下所示:
94 @Override
95 protected void onCreate(Bundle savedInstanceState) {
96 mImpl = ActionBarActivityDelegate.createDelegate(this);
97 super.onCreate(savedInstanceState);
98 mImpl.onCreate(savedInstanceState);
99 }
對於初學者來說,我們並沒有必要去看懂上面那段程式碼的作用,但是只要在我們 CalendarActivity 的 onCreate 呼叫父類別 (ActionBarActivity) 的 onCreate,就能確保上面那段初始化有執行到。
接著來看第 14 行的,我們看到程式呼叫 setContentView 這個 Method,筆者覺得直接告訴讀者 setContentView 的意義,對讀者並沒有太大的幫助,應該是要告訴讀者如何查詢 setContentView 這個 Method 的用法,首先從程式的寫法 (setContentView 前面沒有接任何的類別或物件實體),我們可以知道 setContentView 應該是 CalendarActivity 的 Method 或是 CalendarActivity 祖先類別的 Method,CalendarActivity 的程式碼不長,我們很快發現找不到 setContentView,因此往 ActionBarActivity 去找,果然在 ActionBarActivity 的說明文件 [1] 裡找到了 setContentView 的說明 (程式中呼叫的是需帶入一個整數當參數的那個 Method):「Set the activity content from a layout resource. The resource will be inflated, adding all top-level views to the activity.」。
簡單來說就是設定這個 Activity (畫面) 的內容,而設定的方法是從 Layout 資源中取得,大家是否還記得筆者之前介紹過的 Babylog/app/src/main/res/layout/activity_calendar.xml,這個自動產生的 XML 檔事實上也會在 R 類別 (先前介紹過的 R.java) 的 layout 這個內部類別產生一個名為 activity_calendar 的整數常數,而第 14 行的 setContentView 所帶入的參數即為 R.layout.activity_calendar 這個整數常數,也就是代表這個 Activity 的內容是由 activity_calendar.xml 決定的,這就是為什麼先前筆者都只修改 activity_calendar.xml,而不另外產生一個新的 XML 檔的原因,若只新增一個 XML 文件,但是沒有修改 CalendarActivity.java,畫面的內容並不會更換。
相信介紹到此,讀者應該能舉一反三,靈活應用了,我們可以建立一個名為 foo.xml 的檔案,然後系統會自動在 R.java 產生對應的整數常數,接著修改 CalendarActivity.java ,將 setContentView 的參數換成 R.layout.foo 就會顯示 foo.xml 的內容了。
針對 CalendarActivity.java,我們還有 onCreateOptionsMenu 和 onOptionsItemSelected 尚未介紹,這兩個 Methods 跟「選單 (Menu)」有關,明天會有詳細的介紹,筆者也終於要開始修改 CalendarActivity.java。
參考資料:
[1] ActionBarActivity | Android Developers, https://developer.android.com/reference/android/support/v7/app/ActionBarActivity.html
[2] v7/appcompat/src/android/support/v7/app/ActionBarActivity.java - platform/frameworks/support - Git at Google, https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/v7/appcompat/src/android/support/v7/app/ActionBarActivity.java
[3] Activity | Android Developers, http://developer.android.com/reference/android/app/Activity.html