### 一、寫作前面
當我們做應用的時候,需要用戶配置一些信息,而這就是通常所說的應用設置。
對于Android系統來說,系統本身的設置帶來的用戶體驗和習慣已經深入人心,在我們的應用中同樣用到類似的設置頁,
那么用戶使用起來就會更加親切和方便。是嗎?那我們應該怎么做到呢?這就要靠本文的主人公PreferenceActivity了。
### 二、設置的細節
打開Android手機的設置,如下圖:

我們會看到整個頁面被分為幾組:無線網絡、設備、個人、賬戶和系統。這個分組(或者叫分類)就是PreferenceCategory。
Wifi右邊有開關,這一項就是CheckBoxPreference;其他還有ListPreference和EditTextPreference。
你的每一次設置,都會被Preference存下來,這就是setting的數據持久化。
### 三、如何實現自己的設置
下面我們來實現一個設置程序,看看PreferenceActivity的基本知識都有哪些。
首先要說的是,PreferenceActivity從API level1中就加入了,那么后續自Android3.0后有了Fragment的概念,同時也帶來了PreferenceFragment,這是后話,今天我們先講講簡單的。
這個例子有兩個Activity組成,第一個是MainAcitivity,程序啟動后直接到此,用來現實Setting中的各項設置內容;第二個是Setting,繼承自PreferenceActivity,展示如何設置和數據存儲操作等。我只是想演示PreferenceActivity相關的知識,UI是直接托的,layout中也用了Hardcode,請看官只是取其精華(如果有的話),去其糟粕。
1.Setting
先來說說重頭戲PreferenceActivity,它并不像普通的Activity那樣用layout來做自己的界面,它是用專屬的xml/preference.xml來構建自己的界面,然后在類中加入此xml。
本例演示三種常用preference,如下代碼:
preferenc.xml
~~~
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory android:title="First Category">
<ListPreference
android:key="list_key"
android:defaultValue="list key default value"
android:title="list title"
android:summary="list_summary"
android:entries="@array/list_preference"
android:entryValues="@array/list_preference"
android:dialogTitle="list_dialog_title" />
</PreferenceCategory>
<PreferenceCategory android:title="Second Category">
<EditTextPreference
android:key="edittext_key"
android:defaultValue="edit default value"
android:summary="edit summary"
android:title="edit title" />
<CheckBoxPreference
android:key="checkbox_key"
android:defaultValue="checkbox default value"
android:summary="checkbox summary"
android:title="checkbox title"
/>
<EditTextPreference
android:key="num_key"
android:defaultValue="0"
android:summary="edit summary"
android:numeric="integer"
android:title="input number" />
</PreferenceCategory></PreferenceScreen>
~~~
我將這三項preference分成兩組(PreferenceCategory),First Category和Second Category.
每一個Preference中的都會包含一個key(android:key),它的功能相當于普通layout中的id。
title:這一項的標題,字體比較大。
summary:摘要,標題下面的文字,字體較小。
defaultValue:為設置summary之前的默認值。
其中數組list_preference在array.xml中定義:
~~~
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="list_preference">
<item>Red</item>
<item>Blue</item>
<item>Green</item>
</string-array>
</resources>
~~~
Setting中是怎樣加入這些UI信息呢?
~~~
public?class?Setting?extends?PreferenceActivity?implements?OnSharedPreferenceChangeListener?{??
??????
????private?EditTextPreference?mEtPreference;??
????private?ListPreference?mListPreference;??
????private?CheckBoxPreference?mCheckPreference;??
??????
????@Override??
????protected?void?onCreate(Bundle?savedInstanceState)?{??
????????super.onCreate(savedInstanceState);??
??
????????addPreferencesFromResource(R.xml.preferences);??
????????initPreferences();??
????}??
??????
????private?void?initPreferences()?{??
????????mEtPreference?=?(EditTextPreference)findPreference(Consts.EDIT_KEY);??
????????mListPreference?=?(ListPreference)findPreference(Consts.LIST_KEY);??
????????mCheckPreference?=?(CheckBoxPreference)findPreference(Consts.CHECKOUT_KEY);??
????}??
~~~
此時,這個setting類就可以運行起來了。其實就是這么簡單。也許你會問,我們設置了自己的偏好值,程序中如何獲得呢?
我們需要注冊一個Preference變化的Listener來監聽這些事件。當我們做好設置后,Preference已經替我們做好了數據持久化了。
我們可以用sharedPreference來獲得這些值。
下面來看:
~~~
???@Override??
???protected?void?onResume()?{??
???????super.onResume();??
??
???????//?Setup?the?initial?values??
???????SharedPreferences?sharedPreferences?=?getPreferenceScreen().getSharedPreferences();??
???????mListPreference.setSummary(sharedPreferences.getString(Consts.LIST_KEY,?""));??
???????mEtPreference.setSummary(sharedPreferences.getString(Consts.EDIT_KEY,?"linc"));??
?????????
???????//?Set?up?a?listener?whenever?a?key?changes??
???????sharedPreferences.registerOnSharedPreferenceChangeListener(this);??
???}??
??
???@Override??
???protected?void?onPause()?{??
???????super.onPause();??
???????//?Unregister?the?listener?whenever?a?key?changes??
???????getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);??
???}??????
?????
@Override??
public?void?onSharedPreferenceChanged(SharedPreferences?sharedPreferences,?String?key)?{??
???????if?(key.equals(Consts.EDIT_KEY))?{??
????????mEtPreference.setSummary(??
???????????????????sharedPreferences.getString(key,?"20"));??
???????}?else?if(key.equals(Consts.LIST_KEY))?{??
????????mListPreference.setSummary(sharedPreferences.getString(key,?""));??
???????}??
}??
~~~
到此,setting的功能就實現了。那么,在其他Activity中如何獲得設置的值呢?也是用sharedPreference來實現:
看看我的MainActivity:
~~~
package?com.linc.howtopreferenceactivity;??
??
import?android.os.Bundle;??
import?android.preference.PreferenceManager;??
import?android.app.Activity;??
import?android.content.Intent;??
import?android.content.SharedPreferences;??
import?android.view.Menu;??
import?android.view.View;??
import?android.view.View.OnClickListener;??
import?android.widget.Button;??
import?android.widget.TextView;??
??
public?class?MainActivity?extends?Activity?{??
??
????private?Button?btnSetting,btnShow;??
????private?TextView?tvCheckout,tvList,tvEditText;??
??????
????@Override??
????protected?void?onCreate(Bundle?savedInstanceState)?{??
????????super.onCreate(savedInstanceState);??
????????setContentView(R.layout.activity_main);??
????????initView();??
????}??
??
????private?void?initView()?{??
????????btnSetting?=?(Button)findViewById(R.id.btn_setting);??
????????btnShow?=?(Button)findViewById(R.id.btn_show);??
????????btnSetting.setOnClickListener(buttonListener);??
????????btnShow.setOnClickListener(buttonListener);??
??????????
????????tvCheckout?=?(TextView)findViewById(R.id.tv_checkout);??
????????tvList?=?(TextView)findViewById(R.id.tv_list);??
????????tvEditText?=?(TextView)findViewById(R.id.tv_edittext);??
????}??
??????
????private?OnClickListener?buttonListener?=?new?OnClickListener()?{??
????????@Override??
????????public?void?onClick(View?v)?{??
????????????switch(v.getId())?{??
????????????case?R.id.btn_setting:??
????????????????startActivity(new?Intent(MainActivity.this,Setting.class));??
????????????????break;??
????????????case?R.id.btn_show:??
????????????????showSettingInfo();??
????????????????break;??
????????????}??
????????}??
????};??
??????
????private?void?showSettingInfo()?{??
????????SharedPreferences?settings?=?PreferenceManager.getDefaultSharedPreferences(this);??
????????tvCheckout.setText(settings.getBoolean(Consts.CHECKOUT_KEY,?false)+"");??
????????tvEditText.setText(settings.getString(Consts.EDIT_KEY,?""));??
????????tvList.setText(settings.getString(Consts.LIST_KEY,?"linc"));??
????}??
??????
????@Override??
????public?boolean?onCreateOptionsMenu(Menu?menu)?{??
????????//?Inflate?the?menu;?this?adds?items?to?the?action?bar?if?it?is?present.??
????????getMenuInflater().inflate(R.menu.main,?menu);??
????????return?true;??
????}??
??
}??
~~~
當然,就像用edit text一樣,我們可以限制輸入的是文字還是數字或者是字母。就像上面代碼:android:numeric="integer"
完整代碼在此:[HowToPreferenceActivity](http://download.csdn.net/detail/lincyang/7002263)
- 前言
- 一:文本與布局
- 二:組合控件
- 三:性能測試類
- 四:語音識別
- 五:讀取Excel
- 六:PreferenceActivity使用詳解
- 七:按鈕控制ViewPager的左右翻頁
- 八:Ubuntu下切換JDK版本
- 九:最新Android開發環境(Eclipse+ADT+Android 5.0)
- 十:獲得屏幕物理尺寸、密度及分辨率
- 十一:Android Studio和Gradle
- 十二:Android Studio導入第三方類庫、jar包和so庫
- 十三:APK簽名
- 十四:混淆與反編譯
- 十五:多分辨率適配常用目錄
- 十六:getprop與dumpsys命令
- 十七:Linux下的模擬器硬件加速
- 十八:adb取出安裝在手機中的apk
- 十九:android studio導出jar包(Module)并獲得手機信息
- 二十:兩個開源的圖表/報表控件
- 二十一:Android原型設計工具探索
- 二十二:Android 5.1 SDK下載與配置
- 二十三:Android Studio的NDK開發
- 二十四:橫豎屏切換
- 二十五:模擬器如何重啟?試試Genymotion!
- 二十六:persistableMode與Activity的持久化
- 二十七:Maven編譯開源二維碼掃描項目zxing