Android基礎之資料儲存(SharedPreference)
Android資料持久化是說在斷電後資料不會丟失,而根據儲存位置和實現方式一般有3種方式,這裡說sharedpreferences: 一,sharedpreferences儲存 該種方式是在應用獨有目錄data/data/[packgename]/shared_prefs/下生成相應的preferences檔案儲存資料。 儲存的是鍵值對資料,所以比較適合用於儲存設定,密碼等資料。 API: 1,檔案獲取、建立 PreferenceManager.getDefaultSharedPreferences(Context context); //返回以包名命名的preferences,首次呼叫時沒有檔案就建立 Activity.this.getPreferences(MODE_PRIVATE);//返回以Activity名命名的preferences,首次呼叫時沒有檔案就建立 Context.getSharedPreferences("name",MODE_PRIVATE);//返回以name名命名的preferences,首次呼叫時沒有檔案就建立
2,資料獲取: defaultpreference.getBoolean("remember_pw",false); defaultpreference.getString("account","");
3,資料新增,修改,移除 SharedPreferences.Editor editor=defaultpreference.edit(); editor.putString("account",account); editor.putString("password",password); editor.putBoolean("remember_pw",true); editor.remove("accouint");//移除某個鍵值對 editor.clear();//移除所有資料 editor.commit();
二,Preferences控制元件 以上是preferences的基礎,實際使用過程中android提供了一系列封裝了preferences的控制元件,自動生成packagename_preferencse.xml,自動儲存這些資料,並立時生效。 1,常用Preferences控制元件 PreferenceScreen //所有Preference元素的根節點,如果巢狀,點選後出現一個新的螢幕 PreferenceCategory //用於組合一組Preference,使佈局看起來具有層次關係,美觀 ListPreference //顯示一個相當的list,點選item選中儲存對應value CheckBoxPreference //相當於checkBox EditTextPreference //等同於EditText,點選彈出對話方塊,編輯儲存
2,控制元件屬性 通用: android:key 這個屬性相當於android:id的作用。用此key來唯一表示此Preference android:title Preference的標題, android:summary 表示Preference提示語,相對於android:title來說顯示要小點,而且顯示位置在android:title下面 android:defaultValue 這個表示的是預設值,比如CheclPreference這種preference就可以指定預設是"true"還是“false” android:enabled 表示該Preference是否可用狀態 特有: ListPreference <ListPreference android:key="list" android:title="Options" android:entries="@array/entry_list" android:entryValues="@array/values_list" android:dialogTitle="list dialogtitle" android:defaultValue="1" />
CheckBoxPreference <CheckBoxPreference android:key="checkbox_one" android:title="checbox_one" android:summaryOn="On_check_one" android:summaryOff="offcheck_one" />
3,控制元件獲取,點選,監聽 Activity不是繼承Activity,而是PreferenceActivity; 不是使用setContentView()方法,而是使用addPreferencesFromResource()方法來載入佈局檔案; 佈局檔案一般新增在res/xml下面,以PreferenceScreen為根元素的xml檔案; 與一般Activity一樣在AndroidManifest中註冊。 獲取控制元件: mCheck=(CheckBoxPreference) findPreference("checkbox"); mRing=(RingtonePreference) findPreference("ring"); 點選,監聽: 對PreferenceActivity監聽可以重寫onPreferenceTreeClick() 對Preference控制元件可以註冊OnPreferenceChangeListener和OnPreferenceClickListener
那麼這三個點選事件在一起是什麼用的呢?它的規則如下: 點選某個Preference控制元件後,會先回調onPreferenceChange()方法,即是否儲存值,這裡在實際使用中就會有一些使用處理。 然後再回調onPreferenceClick以及onPreferenceTreeClick()方法,因此在onPreferenceClick/onPreferenceTreeClick方法中我們得到的就是儲存與否之後的,也就是最新的Preference控制元件值。 然後onPreferenceClick會比onPreferenceTreeClick()方法先呼叫,如果onPreferenceClick方法返回true,那就不會再呼叫onPreferenceTreeClick()方法, 如果onPreferenceClick()返回false就會繼續呼叫onPreferenceTreeClick()方法。 下面是程式碼和log例項。
public class ItChqActivity extends PreferenceActivity { private static String TAG="ItChqActivity";
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG,"oonCreate"); addPreferencesFromResource(R.xml.prftest);
CheckBoxPreference preference=(CheckBoxPreference)findPreference("checkbox"); preference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { Log.d(TAG,"onPreferenceChange() newValuew="+newValue); return true; } });
preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { Log.d(TAG,"onPreferenceClick preference.Valuew="+PreferenceManager.getDefaultSharedPreferences(ItChqActivity.this).getBoolean(preference.getKey(),false)); return true; } }); } @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { Log.d(TAG,"onPreferenceTreeClick()"); if(preference.getKey().equals("checkbox")){ Log.i("itchq", "checkbox"); } return true; }
}
1,OnPreferenceChangeListener return true 09-23 08:37:24.904 9135-9135/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceChange() newValuew=false 09-23 08:37:24.905 9135-9135/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceClick preference.Valuew=false 09-23 08:37:24.905 9135-9135/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceTreeClick()
2,OnPreferenceChangeListener return false 09-23 08:39:54.072 9344-9344/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceChange() newValuew=false 09-23 08:39:54.072 9344-9344/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceClick preference.Valuew=true 09-23 08:39:54.072 9344-9344/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceTreeClick()
3,onPreferenceClick return true 09-23 08:41:56.144 9557-9557/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceChange() newValuew=false 09-23 08:41:56.144 9557-9557/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceClick preference.Valuew=false