我想大家對於android的系統配置界面應該不會陌生吧,即便陌生,那么下面的界面應該似曾相識吧,假若還是不認識,那么也沒有關系,我們這一節主要就是介紹並講解android 中系統配置界面的使用,相信大家看完本節后,一定能知道怎么使用這些東西了。
從上述界面中(其實是一個界面),我們可以看到有2組元素,第一組為:自動更新,更新頻率。第二組為:是否登錄,賬號,密碼。
其實分組是為了方便管理而已。這里主要使用到了選擇,列表,編輯框等Preference.
我們還是來溫習下基礎知識吧。
一.基礎知識
通常我們開發一個程序時,會需要給用戶提供一個設置界面,使用戶可以對程序的一些參數進行設置。通常我們使用Preferences的鍵值對存儲方式,來對Android數據持久化。
android.content.SharedPreferences是一個接口,用來獲取和修改持久化存儲的數據。有三種方式可以獲取系統中持久化的數據,這些數據時存放在.xml中的:
1:public SharedPreferences getPreferences (int mode),只隸屬於activity對象,並以這個對象為文件名。
2:public SharedPreferences getSharedPreferences (String name, int mode),隸屬於整個應用,以name名稱保存。
3:public static SharedPreferences getDefaultSharedPreferences (Context context),隸屬於整個應用,保存PreferenceActivity中的設置,根據包名和PreferenceActivity的布局文件來起一個名字保存。
SharedPreferences可以保存Boolean、Int、Float、Long、String等類型。一般是SharedPreferences.Editor的putXXX()方法保存,並commit()方法提交;或者是remove(),方法移除,clear()方法清空,當然操作完畢后需要commit()方法提交。
一般的,可以使用SharedPreferences保存持久化數據,比如登陸賬號,密碼,以及相對固定設置參數等等,看你應用需要。
既然使用到設置參數界面,那么我們可以來認識下一下幾個類標簽:
1:PreferenceScreen 持久化設置界面的頂級容器,代表一屏,里面可以嵌套屏幕,嵌套的時候可以點擊跳轉到另外一屏。
2:PreferenceCategory 當前屏的分組容器,說白了,就是為了划分組而已。
3:CheckBoxPreference,ListPreference,EditTextPreference等等組件。這些都是常見的對應上述的選擇標簽、列表標簽、編輯標簽。
上述組件都有titile,summary,key屬性。title標題描述,summary:詳細描述,key:保存SharedPreferences時候的鍵。
二.實戰
既然有了上述基礎知識后,我們就可以來做如上的設置界面了,在上述界面中,我們知道當前配置界面只需一屏,沒有額外的跳轉,那么需要PreferenceScreen,不需要嵌套其他PreferenceScreen,而設置界面分為兩欄,那么需要兩個PreferenceCategory,並且這個PreferenceCategory可以設置標題。同時根據界面,我們還需要CheckBoxPreference,ListPreference,EditTextPreference等。操作如圖:
當然了,我們還是實際操作下吧,然后實際聯系理論(理論聯系實際太抽象),我們首先編寫使用工具選擇標簽,然后形成代碼,存放在xml文件夾中,如下:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/setting" >
<PreferenceCategory android:title="@string/update" >
<CheckBoxPreference
android:key="@string/update_key"
android:summaryOn="@string/auto_update_switch_summary_on"
android:summaryOff="@string/auto_update_switch_summary_off"
android:summary="@string/auto_update_setting"
android:title="@string/auto_update_switch_title"
android:defaultValue="true"
/>
<ListPreference
android:key="@string/auto_update_frequency_key"
android:dialogTitle="@string/auto_update_frequency_title"
android:entries="@array/auto_frequency_name"
android:entryValues="@array/auto_frequency_value"
android:negativeButtonText="@string/cancel"
android:summary="@string/auto_update_frequency_summary"
android:title="@string/auto_update_frequency_title" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/other" >
<CheckBoxPreference
android:key="@string/isneilflag_key"
android:title="@string/isneilflag"
android:disableDependentsState="true"
/>
<EditTextPreference
android:dependency="@string/isneilflag_key"
android:key="@string/username_key"
android:summary="@string/username_summary"
android:title="@string/username" />
<EditTextPreference
android:dependency="@string/isneilflag_key"
android:key="@string/password_key"
android:summary="@string/password_summary"
android:title="@string/password" />
</PreferenceCategory>
</PreferenceScreen>
當然這里使用到了一些文件,代碼一並釋放:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, PreferenceActivityDemoActivity!</string>
<string name="app_name">PreferenceActivityDemo</string>
<string name="cancel">取消</string>
<string name="other">其他</string>
<string name="setting">設置</string>
<string name="update">更新</string>
<string name="auto_update_switch_title">自動更新</string>
<string name="auto_update_setting">自動更新設置</string>
<string name="auto_update_switch_summary_on">開啟自動更新</string>
<string name="auto_update_switch_summary_off">關閉自動更新</string>
<string name="auto_update_frequency_title">更新頻率</string>
<string name="auto_update_frequency_summary">設置更新周期</string>
<string name="isneilflag">是否匿名登錄</string>
<string name="username">帳號</string>
<string name="password">密碼</string>
<string name="username_summary">提供您帳號</string>
<string name="password_summary">提供您密碼</string>
<string name="update_key">update_key</string>
<string name="auto_update_frequency_key">auto_update_frequency_key</string>
<string name="isneilflag_key">isneilflag_key</string>
<string name="username_key">username_key</string>
<string name="password_key">password_key</string>
</resources>

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="auto_frequency_name">
<item>10分鍾</item>
<item>30分鍾</item>
<item>1小時</item>
<item>12小時</item>
</string-array>
<string-array name="auto_frequency_value">
<item>10</item>
<item>30</item>
<item>60</item>
<item>720</item>
</string-array>
</resources>
接下來,我們就來解釋下xml文件夾中設置文件的一些內容吧:
android:key="@string/update_key" 這個是我們持久化時SharedPreferences保存的鍵,
android:summaryOn="@string/auto_update_switch_summary_on" 選中后顯示內容
android:summaryOff="@string/auto_update_switch_summary_off" 未選中后顯示內容
android:summary="@string/auto_update_setting" 平常狀態顯示內容
android:title="@string/auto_update_switch_title" 標題
android:defaultValue="true" 默認值
android:dialogTitle="@string/auto_update_frequency_title" 對話框標題
android:entries="@array/auto_frequency_name" 列表項顯示名稱
android:entryValues="@array/auto_frequency_value" 列表項值
android:disableDependentsState="true" 當CheckBoxPreference的值為真的時候,禁用依賴於該設置的其他設置項。
android:dependency="@string/isneilflag_key" 根據上述設置依賴於CheckBoxPreference的真值進行啟用與禁用。
注意:我們可以從上圖知道ListPreference是繼承之Preference,以及DialogPreference的,那么就有它們的屬性以及方法了。
好了,設置界面已經定義完成,我們來定義一個activity繼承之PreferenceActivity,並使之顯示吧。
當然噩夢可以再使之繼承接口OnPreferenceChangeListener,OnPreferenceClickListener,當PreferenceActivity中的某一個Preference進行了點擊或者改變的操作時,都會回調接口中的函數。
具體代碼如下:

package com.dongzi;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceManager;
import android.preference.PreferenceActivity;
import android.util.Log;
public class PreferenceActivityDemoActivity extends PreferenceActivity
implements OnPreferenceChangeListener,OnPreferenceClickListener{
static final String TAG="PreferenceActivityDemoActivity";
SharedPreferences preference=null;
CheckBoxPreference updateCheckBoxPreference=null;
ListPreference lististPreference=null;
CheckBoxPreference isneilflag_CheckBoxPreference=null;
EditTextPreference usernameEditTextPreference=null;
EditTextPreference passwordEditTextPreference=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//設置顯示Preferences
addPreferencesFromResource(R.xml.preference);
//獲得SharedPreferences
preference=PreferenceManager.getDefaultSharedPreferences(this);
//找到preference對應的Key標簽並轉化
updateCheckBoxPreference=(CheckBoxPreference)findPreference(getString(R.string.update_key));
lististPreference=(ListPreference)findPreference(getString(R.string.auto_update_frequency_key));
isneilflag_CheckBoxPreference=(CheckBoxPreference)findPreference(getString(R.string.isneilflag_key));
usernameEditTextPreference=(EditTextPreference)findPreference(getString(R.string.username_key));
passwordEditTextPreference=(EditTextPreference)findPreference(getString(R.string.password_key));
//為Preference注冊監聽
updateCheckBoxPreference.setOnPreferenceChangeListener(this);
updateCheckBoxPreference.setOnPreferenceClickListener(this);
lististPreference.setOnPreferenceClickListener(this);
lististPreference.setOnPreferenceChangeListener(this);
isneilflag_CheckBoxPreference.setOnPreferenceChangeListener(this);
isneilflag_CheckBoxPreference.setOnPreferenceClickListener(this);
usernameEditTextPreference.setOnPreferenceChangeListener(this);
passwordEditTextPreference.setOnPreferenceChangeListener(this);
}
@Override
public boolean onPreferenceClick(Preference preference) {
//判斷是哪個Preference改變了
if(preference.getKey().equals(getString(R.string.update_key))){
Log.e(TAG, getString(R.string.update_key));
}else if(preference.getKey().equals(getString(R.string.isneilflag_key))){
Log.e(TAG, getString(R.string.isneilflag_key));
}
//返回true表示允許改變
return true;
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
//判斷是哪個Preference改變了
if(preference.getKey().equals(getString(R.string.username_key))){
//賬號
Log.e(TAG, getString(R.string.username_key));
}else if(preference.getKey().equals(getString(R.string.password_key))){
//密碼
Log.e(TAG, getString(R.string.password_key));
}else if(preference.getKey().equals(getString(R.string.auto_update_frequency_key))){
//列表
Log.e(TAG, getString(R.string.auto_update_frequency_key));
}
//返回true表示允許改變
return true;
}
}
從上述代碼可知:
1:設置顯示Preferences可以調用方法addPreferencesFromResource(R.xml.preference); 傳遞preference文件即可。
2:然后通過findPreference();方法找到鍵的類標簽
3:我們定義2個監聽接口監聽參數是否設置成功。
4:在監聽接口中返回true就是設置允許提交。
結果打印如下:
成功!
也許你會問,我們這里並沒有使用
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
settings.getXXXX();settings.putXXXX();以及commit()等方法,設置、獲取並提交值啊?!是的,在這里我們不需這樣,因為
當PreferenceActivity中的內容改變時,Android系統會自動進行保存和持久化維護,我們只需要在要用的設置界面中數據的地方進行讀取就可以了。
當然,您可以在其他界面使用SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);等類方法來獲取數據,看能不能獲取到