本文要做的事情就是在前面做的簡單的ToDoList程式上增加一個配置項頁面(Reference)。這個Reference頁面也非常簡單:
這個ToDoList現在有兩個頁面,首頁面能填寫待辦事項,然後manu鍵彈出可以跳轉到Reference頁面,在Reference頁面只有一個checkbox,來給使用者確認是否要本地儲存(具體的本機存放區的功能沒有具體實現),Reference頁面還有兩個按鈕,儲存和返回。點擊儲存按鈕,程式會儲存使用者是否已經選定了本地儲存,點擊返回按鈕,頁面會跳轉到ToDoList頁面。
在這個程式中主要是有幾個地方需要處理
1 如何在兩個Activity中進行切換
這是兩個頁面,所以我們首先會想到需要兩個layout檔案,於是我們建立了一個res/layout/preferences.xml,在這個layout中定義好了一個checkbox和兩個按鈕。現在的問題是當我點擊main.xml中的manu按鈕的時候,它是會觸發onOptionsItemSelected事件的,所以我們需要在這個事件中觸發reference頁面。這個如何做呢?
大致是有兩種方法:
1 在ToDoListActivity中調用setContentView來觸發preferences.xml的展現。
2 重新建立一個Activity類Reference,ToDoListActivity中使用Intent觸發Reference的啟動,繪製等功能。
這兩種方法有什麼不同呢?
第一種方法相當於html中使用js來讓不同的div的意思。它的好處就是簡單,對於簡單的邏輯和頁面完全可以這麼做。它的缺點也顯而易見,等於是一個Activity控制多個layout,那麼在代碼層面,會是所有的邏輯都存放在一個類中,對於代碼的易用性和維護性都是很大的損失。對於我們這個應用,我們選擇第二種方法。
所以我們的onOptionsItemSelected事件代碼如下:
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.manu_reference:
Intent intent = new Intent();
intent.setClass( this, Reference. class);
startActivity(intent);
}
return true;
}
當我在manu中觸發的item是manu_reference(這個已經在配置中設定了id),那麼我就啟動我需要的Activity。
2 Intent和Activity
Android應用程式的三種核心的組件:Activity,Service, Brocast Receiver。這三種組件互相或者內部進行互動的訊息就叫做Intent。比如在我們這個程式中,就是兩個Activity需要進行互動,這個時候就需要使用到了Intent了。
Intent有三種用法:
傳遞給Activity:startActivity(Intent), startActivityForResult()
傳遞給Service:startService(Intent), bindService()
傳遞給Broadcast:sendBroadcast(), sendOrderedBroadcast(), sendStickyBroadcast()
在這個例子中,除了從ToDoListActivity跳到Reference,也有從Reference跳到ToDoListActivity(點擊返回按鈕)。
Button cancelReference = (Button)findViewById(R.id. cancel);
cancelReference.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(Reference.this, ToDoListActivity.class);
startActivity( intent);
}
});
3 配置項儲存
關於配置項儲存這裡使用的是SharePreferences。SharePreferences提供了一個介面讓你能儲存和擷取持久化的key-value資料。你可以持久化的資料類型有:boolean,float,int,long,string。
簡單來說:
建立對象使用方法:
getSharePreferences()
getPreferences()
寫資料使用方法:
1 使用edit()擷取寫控制代碼
2 調用putXXXX()方法
3 調用commit
讀資料使用方法:
getXXX()
在這個例子中有這樣用到:
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
boolean isSaveLocal = prefs.getBoolean( IS_SAVE_LOCAL, false);
...
Editor editor = prefs.edit();
editor.putBoolean( IS_SAVE_LOCAL, isChecked);
editor.commit();