iT邦幫忙

DAY 20
2

以「寶寶聯絡簿」為例,適合 Android 初學者的學習筆記系列 第 20

寶寶生活記錄 App (Day20 偏好設定)

  • 分享至 

  • twitterImage
  •  

這個系列(「寶寶生活記錄 App」開發日記)從 10 月 5 日起就圍繞著資料庫打轉,資料庫原是為了實作「新增寶寶」與「寶寶列表」這兩個選項而設計的,其實除了資料庫,Android 還提供了其它的儲存機制,今天會介紹偏好設定「SharedPreferences [1]」這個儲存機制,SharedPreferences 顧名思義適合用來儲存使用者的偏好,例如顯示月曆時,通常使用者可以設定每週的第一天是星期一、星期六還是星期天,這種「偏好」就很適合利用 SharedPreferences 來儲存,事實上SharedPreferences 適合用來儲存任何「基本資料型別(以每週的第一天為例,我們可使用整數來儲存)」且只有單筆(多筆資料應該考慮使用資料庫來儲存)的資料。

接下來就用一個簡單的範例來說明 SharedPreferences 的使用:

final String PREF_FILE = "PREF_FILE";
final String PREF_SHOWUSAGE = "PREF_SHOWUSAGE";
final String PREF_STARTUSE = "PREF_STARTUSE";
final String PREF_USERNAME = "PREF_USERNAME";

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);

	SharedPreferences pref = getSharedPreferences(PREF_FILE, MODE_PRIVATE);

	boolean showusage = pref.getBoolean(PREF_SHOWUSAGE, true);
	long startuse = pref.getLong(PREF_STARTUSE, 0);
	String username = pref.getString(PREF_USERNAME, "");

	Log.d("LINCYU", "ShowUsage: " + showusage + ", StartUse: " + startuse +
		", Username: " + username);

	SharedPreferences.Editor editor = pref.edit();
	editor.putBoolean(PREF_SHOWUSAGE, false);
	editor.putLong(PREF_STARTUSE,
		Calendar.getInstance().getTimeInMillis());
	editor.putString(PREF_USERNAME, "Kimi");
	editor.commit();

	showusage = pref.getBoolean(PREF_SHOWUSAGE, true);
	startuse = pref.getLong(PREF_STARTUSE, 0);
	username = pref.getString(PREF_USERNAME, "");

	Log.d("LINCYU", "ShowUsage: " + showusage + ", StartUse: " + startuse +
		", Username: " + username);

}

首先第 11 行,程式先呼叫 Context 類別的 getSharedPreferences 取得 SharedPreferences 物件實體(Activity 是一個 Context 物件),getSharedPreferences需要兩個參數,第一個參數是偏好設定檔的檔案名稱,以本程式為例,此偏好設定檔為 PREF_BIRTH.xml,第二個參數是設定此偏好設定檔的讀取模式,MODE_PRIVATE 代表只允許本應用程式存取這個檔案。

要修改偏好設定檔必須透過一個 SharedPreferences.Editor 物件,因此程式在第 20 行呼叫SharedPreferences 物件的 edit 方法來取得一個 SharedPreferences.Editor 物件,SharedPreferences.Editor提供了不少Methods讓我們儲存資料[2],儲存時是以 Key-Value 的形式來儲存,為了示範,筆者在 21 ~ 24 行分別示範如何寫入布林、長整數和字串,putBoolean, putLong 和 putString 的第一個參數是 Key,Key 是使用一個字串來表示,程式使用了自己定義的字串常數,使用字串常數是個好習慣,之後要取出偏好設定值時,必須使用相同的 Key,如果寫入時使用 “PREF_SHOWUSAGE”,而讀出時使用 “Pref_ShowUsage”,這肯定是讀不到的,且通常這種錯誤要到執行階段才會發現,造成開發時間的浪費,因此強烈建議使用字串常數來當 Key。第二個參數則是 Value,程式分別放入不同資料型態的值。最後我們一定要呼叫SharedPreferences.Editor物件的commit方法,才能將修改寫入偏好設定檔內。

瞭解如何將偏好設定寫入之後,我們接著討論程式如何讀取偏好設定檔,程式 13 ~ 15 行示範了讀取偏好設定的方法,getBoolean, getLong 和 getString 一樣需要兩個參數,第一個參數是 Key,相信讀者都已經了解了,第二個參數是預設值 (Default Value),當找不到相對應的 Key 時,就會使用預設值,第一次執行本程式時,就會使用預設值,但要注意的是,當第二次執行本程式時, 13 ~ 15 行和 27 ~ 29 行的執行結果會是一樣的(只要您沒有清掉偏好設定值),下圖是第一次執行程式的結果(請注意 LogCat 視窗):

另外從上圖我們亦可發現,偏好設定檔 (PREF_FILE.xml) 會儲存在前幾天介紹過的「App 自己的專屬空間」,精確地說是 /data/data/<package name>/shared_prefs 下,我們可嘗試下載這個 XML 檔,其內容如下:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <long name="PREF_STARTUSE" value="1411998017620" />
    <boolean name="PREF_SHOWUSAGE" value="false" />
    <string name="PREF_USERNAME">Kimi</string>
</map>

相信讀者不難了解其內容。至於如何把偏好設定分享給其它 App,可參考筆者的書籍 [3]。

參考資料

[1] SharedPreferences | Android Developers, http://developer.android.com/reference/android/content/SharedPreferences.html

[2] SharedPreferences.Editor | Android Developers, http://developer.android.com/reference/android/content/SharedPreferences.Editor.html

[3] 林致宇, Android程式設計入門與應用(附範例光碟), 全華出版社, ISBN: 9789572194126, http://www.opentech.com.tw/search/bookinfo.asp?isbn=9789572194126&companyID=04383129


上一篇
寶寶生活記錄 App (Day19 Android Device Monitor)
下一篇
寶寶生活記錄 App (Day21 如何防止進入此畫面時跳出鍵盤與自訂背景的EditText)
系列文
以「寶寶聯絡簿」為例,適合 Android 初學者的學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言