android开发之PreferenceScreen使用详解
一 PreferenceActivity
1、PreferenceActivity概述
PreferenceActivity是一個抽象類,繼承于ListActivity,以列表形式視圖來展現(xiàn)界面,加載的整個View也是基于ListActivity中那個ListView的,其最主要的優(yōu)勢在于添加Preference后可讓其狀態(tài)持久化儲存(通過SharedPreferences,一般存儲在/data/data//shared_prefs文件夾下的默認(rèn)名為“app package name”+”_preferences.xml”的文件里),比如說用戶勾選CheckBox后退出應(yīng)用,下一次進(jìn)入到這一界面時候,對應(yīng)的是CheckBox依然是被勾選狀態(tài),如果要實現(xiàn)這樣的機制,我們自己也可以實現(xiàn),但是沒有必要,因為Android已經(jīng)替我們實現(xiàn)了,就是我們的這一系列的主角——Preference,Preference會自動地替我們?nèi)ケ4孢@些狀態(tài)對應(yīng)的值到對應(yīng)的SharedPreferences文件里,而當(dāng)我們每次啟動的時候Acitivity(PreferenceActivity)會自動根據(jù)key去獲取相關(guān)數(shù)據(jù),完成用戶界面的更新。我們手機當(dāng)中的系統(tǒng)設(shè)置就是及其典型的Preference的應(yīng)用,也正是由于工作中需要去客制化Settings,才有了這一系列的文章。
SharedPreferences往往很容易被我們忽視兩點
并非我們第一次打開相應(yīng)界面之后就會自動創(chuàng)建對應(yīng)的SharedPreferences文件,而是在我們改變了原有狀態(tài)時候
并非所有的Preference及其子類都會創(chuàng)建,僅僅針對需要記錄狀態(tài)的Preference。
2、PreferenceActivity的初始化
PreferenceActivity其實和普通的Activity本質(zhì)上來說區(qū)別不大,只不過多了些自動去讀取SharedPrefrences的值來更新界面和其他一些邏輯,所以初始化本質(zhì)上來說并無很大的區(qū)別,但是與普通Activity的layout不同,PreferenceActivity的layout我們可以理解成為兩個部分:其他View和一個id為android.R.id.list的ListView,那么我們可以理解成為當(dāng)我們在onCreate方法里先調(diào)用setContentView完成整個Activity的View的構(gòu)建(layout文件里必須包含id為android.R.id.list的listView,否則會報E/AndroidRuntime: Caused by: Java.lang.RuntimeException: Your content must have a ListView whose id attribute is ‘a(chǎn)ndroid.R.id.list’),再調(diào)用addPreferencesFromResource來完成Preference界面的構(gòu)建;當(dāng)然也可以只調(diào)用addPreferencesFromResource方法。
1、繼承PreferenceActivity實現(xiàn)具體業(yè)務(wù)類,重寫相關(guān)生命周期方法
public class MainActivity extends PreferenceActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);addPreferencesFromResource(R.xml.demo_preference);}... }2、通過addPreferencesFromResource(xml資源id)加載靜態(tài)xml資源文件 或者 完全通過代碼構(gòu)造對象再動態(tài)添加
在res文件夾下新建xml文件夾,再在xml文件中新建對應(yīng)的xml資源,xml資源類似我們在使用普通Activity時的layout文件,PreferenceActivity獨特之處在于并不是使用普通的layout文件,而是使用res下xml文件夾下的xml資源文件
res/xml/demo_preference.xml
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > <CheckBoxPreferenceandroid:key="key_checkbox_preference"android:summary="Some summay for CheckBoxPreference"android:title="The Title Of CheckBoxPreference" /> </PreferenceScreen>也可通過代碼去構(gòu)造對象,添加容器之后再調(diào)用setPreferenceScreen(PreferenceScreen preferenceScreen)把容器對象設(shè)置到Activity上
private void createPreference(){PreferenceScreen preferenceScreen = this.getPreferenceManager().createPreferenceScreen(this);//先構(gòu)建PreferenceScreen對象得到一個布局容器this.setPreferenceScreen(preferenceScreen);//設(shè)置容器CheckBoxPreference checkBoxPreference=new CheckBoxPreference(this);//構(gòu)建一個子Preference,待添加到容器中checkBoxPreference.setKey(CHECKBOXPRERENCE_KEY);//設(shè)置keycheckBoxPreference.setTitle("The Title Of CheckBoxPreference");//設(shè)置titlecheckBoxPreference.setSummary("Some summay for CheckBoxPreference");preferenceScreen.addPreference(checkBoxPreference);//添加到容器中}二 Preference的使用
前一篇文章我們講述了Preference家族的基類(接下來我們所要介紹的其他子類Preference一定是繼承了他的所有屬性也可以理解成都是在繼承他所展示的UI效果及交互功能的基礎(chǔ)上升級的)而且Preference可以實例化,那么我們就可以把他看成對應(yīng)的一個組件,其實和我們熟悉的TextView一樣,所以我們需要使用的時候第一步肯定是先得到他的對象——而構(gòu)造對象我們都可以通過兩種方式:通過其對應(yīng)的構(gòu)造方法或者其他方法和通過xml映射(或許說法不夠準(zhǔn)確),接著第二步PreferenceActivity的初始化,再接著根據(jù)業(yè)務(wù)設(shè)置相關(guān)監(jiān)聽。
1、構(gòu)造Preference容器和Preference對象
前面Android進(jìn)階——Preference詳解之初識Preference及Preference系(一)已經(jīng)講過PreferenceScreen只能作為top-level節(jié)點,而構(gòu)造對象我們都可以通過兩種方式:通過其對應(yīng)的構(gòu)造方法或者其他方法和通過映射xml(或者講法不夠準(zhǔn)確)。
res/xml/test_preference.xml
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:key="using_categories_in_root_screen" android:summary="Using Preference Categories" android:title="Categories"> <Preferenceandroid:key="key_prerence"android:title="Preferece"android:summary="Preference Demo"/> </PreferenceScreen>2、初始化PreferenceActivity和設(shè)置相關(guān)監(jiān)聽
常見的Preference的事件有兩個:setOnPreferenceClickListener和onPreferenceChange
設(shè)置Preference點擊監(jiān)聽
preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {@Overridepublic boolean onPreferenceClick(Preference preference) {//當(dāng)接收到Click事件之后觸發(fā)return true;}});設(shè)置Preference對應(yīng)的SharedPrefernces值監(jiān)聽
preference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {@Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {//如果值改變了我們可以通過監(jiān)聽這個事件來處理return true;}});@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//activity_main里必須存在id為android.R.id.list的ListView否則報E/AndroidRuntime: Caused by: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'addPreferencesFromResource(R.xml.test_preference);mContext=getApplicationContext();preference=findPreference(PREFERENCE_KEY);preference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {@Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {//如果值改變了我們可以通過監(jiān)聽這個事件來獲取新值Toast.makeText(mContext, String.format("Preference的值為%s", newValue),Toast.LENGTH_LONG).show();return true;}});//設(shè)置Preference的點擊事件監(jiān)聽preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {@Overridepublic boolean onPreferenceClick(Preference preference) {//當(dāng)接收到Click事件之后觸發(fā)Toast.makeText(mContext, "Preference Clicked",Toast.LENGTH_LONG).show();return true;}}); }3、Preference的常用xml屬性
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="PreferenceScreen"> <PreferenceCategory android:key="key_prerence" android:summary="Preference Categories Summary" android:title="Preference Categories"> <CheckBoxPreferenceandroid:icon="@mipmap/ic_launcher"android:key="key_chkpreference"android:title="CheckBoxPreferenceCheckBoxPreferenceCheckBoxPreferenceCheckBoxPreference"android:summary="CheckboxPreference summary"/> <Preferenceandroid:title="Preference"android:key="key_pre"android:icon="@mipmap/ic_red_launcher"android:layout="@layout/activity_main"/> <EditTextPreferenceandroid:icon="@mipmap/ic_blue_launcher"android:key="key_edtkpreference"android:title="EditPreference"android:summary="EditPreference summary"/> </PreferenceCategory></PreferenceScreen>4、Preference的xml文件中的常用標(biāo)簽intent、extra
在xml文件的Preference標(biāo)簽中,我們可以添加intent來為我們快速實現(xiàn)一種意圖,比如說快速打開一個網(wǎng)頁,或者快速啟動一個Activity等等,還可以使用extra給intent標(biāo)簽加參數(shù)來傳遞參數(shù)(再通過getIntent().getStringExtra(“key”)來獲取)。
點擊這個Preference則會自動去調(diào)用瀏覽器打開http://www.hao123.com網(wǎng)頁
<Preferenceandroid:title="Click me open the web"android:key="key_pref_intent"><intent android:action="android.intent.action.VIEW"android:data="http://www.hao123.com"/><!--可以通過<extra>傳附加信息getIntent().getStringExtra("reused_key") --><extraandroid:name="key"android:value="value"/> </Preference>啟動指定類
<Preferenceandroid:title="PREFERENCE TITLE"><!-- android:targetPackage是應(yīng)用程序的包名,而android:targetClass的路徑在子包下的類 --><!-- android:targetPackage設(shè)置為子包,運行時則找不到Activity --><intentandroid:action="ACTION_A_INTENT"android:targetPackage="com.crazy.training"android:targetClass="com.crazy.training.ui.MainActivity"></intent> </Preference>三、PreferenceScreen和PreferenceCategory
PreferenceScreen和PreferenceCategory沒有新增的屬性,所有屬性全部繼承自Preference。其中PreferenceScreen作為頂級容器,PreferenceCategory作為次級容器(類似于SQL Group by功能暫且這么理解吧),雖然他們也是可以單獨使用的,但是并不能響應(yīng)onPreferenceClick和onPreferenceChange事件。
布局和MainActivity的代碼依然很簡單和前面類似
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="PreferenceScreen"> <PreferenceCategory android:key="key_prerence" android:summary="Preference Categories Summary" android:title="Preference Categories"> </PreferenceCategory> </PreferenceScreen> <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="PreferenceScreen"> <PreferenceCategory android:key="key_prerence" android:summary="Preference Categories Summary" android:title="Preference Categories"> <CheckBoxPreferenceandroid:icon="@mipmap/ic_launcher"android:key="key_chkpreference"android:title="CheckBoxPreference"android:summary="CheckboxPreference summary"/> <EditTextPreferenceandroid:icon="@mipmap/ic_blue_launcher"android:key="key_edtkpreference"android:title="EditPreference"android:summary="EditPreference summary"/> </PreferenceCategory> </PreferenceScreen>四、RingtonePreference的應(yīng)用
RingtonePreference起作用就是供我們選擇系統(tǒng)鈴聲的,除了Preference共有的屬性外還新增了自己的幾個獨特屬性。
應(yīng)用也很簡單,與Preference大同小異(注意看圖)
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:key="using_categories_in_root_screen" android:summary="Using Preference Categories" android:title="Categories"> <RingtonePreferenceandroid:key="key_prerence"android:title="RingPreferece Title"android:summary="RingPreference Summary"/></PreferenceScreen>五、Preference的管理
Preference的管理主要包含Preference的創(chuàng)建、添加、移除和尋找特定Preference,Preference并沒有直接提供相關(guān)替換的方法。
1、創(chuàng)建Preference
主要是通過各自對應(yīng)Preference的構(gòu)造方法或者直接在xml文件中定義來創(chuàng)建對應(yīng)的Preference
2、addPreference添加Preference
添加只要是就是調(diào)用PreferenceGroup的addPreference(Preference preference)方法 來添加至容器PreferenceGroup。
3、findPreference尋找特定Preference
對于PreferenceActivity的findPreference(key)方法,我們只需要知道key值就可以找到同一xml文件下相應(yīng)的Preference,勿需考慮層級和嵌套關(guān)系
4、removePreference或removeAll移除Preference
對于PreferenceGroup的removePreference(Preference preference)和removeAll()方法,都是針對某個PreferenceGroup來處理的,所以我們必須考慮層級嵌套關(guān)系,可以分為兩步:先找到PreferenceGroup和要刪除的Preference,再調(diào)用PreferenceGroup的removePreference執(zhí)行刪除動作。
首先這是我們的布局
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:key="key_manage_prefs"> <PreferenceCategoryandroid:key="key_category"android:title="PreferenceCategory"><EditTextPreferenceandroid:key="key_edtprefs"android:title="EditTextPreference" /><PreferenceScreenandroid:key="key_child_prefscreen"android:title="Child PreferenceScreen"><CheckBoxPreferenceandroid:key="key_checkbox"android:title="CheckBoxPreference" /></PreferenceScreen> </PreferenceCategory> </PreferenceScreen>測試主體代碼
public class MainActivity extends PreferenceActivity {private Context mContext; private Preference preference; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);addPreferencesFromResource(R.xml.test_preference);//removePreferenceByKey();mContext=getApplicationContext();preference=findPreference("key_checkbox_child");//只要是同一個xml文件下的所有Preference都能通過key直接找到preference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {@Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {Toast.makeText(mContext, String.format("Preference的值為%s", newValue),Toast.LENGTH_LONG).show();return true;}});preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {@Overridepublic boolean onPreferenceClick(Preference preference) {Toast.makeText(mContext, "Preference Clicked",Toast.LENGTH_LONG).show();//getFragmentManager().beginTransaction().replace(android.R.id.content,new MainFragment()).commit();return false;}}); }private void removePreferenceByKey(){/*PreferenceGroup preferenceGroup=(PreferenceGroup)findPreference("key_category");//先找到PreferenceGroupPreference preference=findPreference("key_edtprefs");//再找到要刪除的Preference*//*(PreferenceGroup)findPreference("key_child_prefscreen").removePreference(findPreference("key_checkbox_child"));//執(zhí)行刪除key為key_checkbox_child的Preference**/getPreferenceScreen().removePreference(findPreference("key_category"));//刪除掉key_category及對應(yīng)節(jié)點下的所有節(jié)點//ERROR//getPreferenceScreen().removePreference(findPreference("key_edtprefs"));//無效,因為getPreferenceScreen獲得的是當(dāng)前的頂級容器,而key_edtprefs不是它的直接字節(jié)點((PreferenceGroup)findPreference("key_category")).removeAll();//僅刪除掉key_category下對應(yīng)Preference節(jié)點下的所有子節(jié)點 }這篇文章主要介紹了Preference家族樹中頂級成員和次級成員的應(yīng)用和簡單原理的說明,也基本把幾乎所有相關(guān)的知識點都涉及了,Preference的基本語法都是一樣的,區(qū)別在于各自不同的特性。
本文轉(zhuǎn)自:http://blog.csdn.net/Google_huchun/article/details/70195114
總結(jié)
以上是生活随笔為你收集整理的android开发之PreferenceScreen使用详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Snake算法
- 下一篇: 山东中职计算机应用基础课件,计算机应用基