Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android進階——Preference詳解之Preference系的基本應用(三)

Android進階——Preference詳解之Preference系的基本應用(三)

編輯:關於Android編程

引言

前面一篇文章介紹了二級Preference的使用和特點,接下來進入系統給我提供的底級Preference的使用CheckBox選擇項CheckBoxPreference、EditText編輯對話框EditTextPreference、列表選擇ListPreference、多項選擇MultiSelectListPreference、 開關選擇SwitchPreference的應用和管理。以期大家能在學習的時候不僅僅只是會用,更應該知其然而知其所以然。

一、Preference系樹形結構圖

首先還是再來回顧下Preference系的樹形結構圖,加深下他們之間的繼承關系。
這裡寫圖片描述

二、DialogPreference系

DialogPreference是一個抽象類直接繼承自Preference,它的獨特之處在於它是基於Dialog的,也就是說但我們點擊對應的DialogPreference系時是以Dialog形式展現的。系統給我們提供了以下幾個它的子類:EditTextPreferenceListPreferenceMultiSelectListPreference

1、DialogPreference系的共性

我們都知道DialogPreference是基於Dialog的,當我們點擊的時候會以對話框的形式顯示出來,所以除了繼承自Preference的屬性之外也還新增了很多自己獨有的屬性和方法。

1.1、DialogPreference系獨有屬性

DialogPreference系獨有屬性 說明 android:dialogIcon 對話框的icon android:dialogLayout dialog 的contentView 布局 android:dialogMessage 對話框的內容 android:dialogTitle 對話框的標題 android:negativeButtonText 對話框裡的按鈕1名稱 android:positiveButtonText 對話框裡的按鈕2名稱

1.2、DialogPreference獨有的方法

這裡只列出三個有用的回調方法,其他setter、gettter方法和其他方法由於篇幅問題就不列出了(下同)。

方法 說明 void onActivityDestroy() 與Activity的onDestory類似,其實就是PreferenceManager.OnActivityDestroyListener的回調方法 void onClick(DialogInterface dialog, int which) 當對話框裡的按鈕被點擊時,可以通過which來判斷點擊的按鈕,其實就是DialogInterface.OnClickListener的回調方法 void onDismiss(DialogInterface dialog) 當對話框消失後執行,其實就是DialogInterface.OnDismissListener的回調方法

2、DialogPreference系的應用與管理

1、EditTextPreference

EditTextPreference新增方法 說明 EditText getEditText() 獲取顯示在Dialog上的EditText String getText() 獲取對應SharedPreferences保存的值

vcmllcw==" xmlns:android="http://schemas.android.com/apk/res/android">    

這裡寫圖片描述

2、ListPreference

ListPreference和其他Preference一樣的機制,也是借助於SharedPreferences來實現存儲和更新,特別之處在於SharedPreferences存儲的是android:entryValues的值(即android:entryValues與key一一對應形成鍵值對),而顯示到界面的是android:entries則與android:entryValues一一對應

2.1、ListPreference的特有屬性

ListPreference新增屬性 說明 android:entries 列表的顯示項數據源 android:entryValues 列表實際保存至內部的值 android:defaultValue 這個屬性不是特有的,但是有一點需要注意:這裡設置的是android:entryValues裡的值 android:dialogMessage 如果設置了這個屬性,那麼列表怎麼會被覆蓋掉

2.2、ListPreference的特有方法

ListPreference新增方法 說明 int findIndexOfValue(String value) 返回獲取ListPreference中的實體內容的下標值 CharSequence[] getEntries() 返回當前Preference設置的entries集合(xml配置的字符串數據源) CharSequence getEntry() 返回當前選中的entries值 CharSequence[] getEntryValues() 返回當前的entries對應的value集合(xml配置的字符串數據源) CharSequence getSummary() 獲取當前summary String getValue() 獲取key值

2.3、ListPreference應用

列表數據源字符數組:



    
        Dota
        Dota2
        NBA2K10
        FIFA2K10
    
    
        0
        1
        2
        3
    

ListPreference的xml文件:



    

PreferenceActivity的實現:

public class ListPreferenceActivity extends PreferenceActivity implements Preference.OnPreferenceChangeListener{
    private ListPreference preference;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.list_preference);
        init();
    }
    private void init(){
        preference= (ListPreference) findPreference("key_listpreference");
        ///preference.setOnPreferenceClickListener(this); ****點擊事件已經被覆蓋掉了****
        preference.setOnPreferenceChangeListener(this);
        // 設置summary為所選中的值列表值
        if(preference.getEntry()!=null) {
            preference.setSummary(preference.getEntry());//初始化時設置summary
        }
    }
    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        /*newValue 返回的值是getEntries的值
        * 01-09 12:30:43.558 15872-15872/com.crazymo.prerencescreen D/TAG2: onPreferenceChange run1
        * 01-09 12:41:10.627 15872-15872/com.crazymo.prerencescreen D/TAG2: onPreferenceChange run2
        * */
        if(preference instanceof ListPreference) {
            ListPreference listPreference = (ListPreference) preference;//把preference這個Preference強制轉化為ListPreference類型
            CharSequence[] entries = listPreference.getEntries();//獲取ListPreference中的實體內容
            int index = listPreference.findIndexOfValue((String) newValue);//獲取ListPreference中的實體內容的下標值
            listPreference.setSummary(entries[index]);//listPreference中的sumamry顯示為當前ListPreference的實體內容中選擇的
            Log.d("TAG2", "onPreferenceChange run"+newValue);
            Toast.makeText(ListPreferenceActivity.this,entries[index].toString(),Toast.LENGTH_LONG).show();
        }
        return true;
    }
}

這裡寫圖片描述

3、MultiSelectListPreference

MultiSelectListPreference和ListPreference都是列表形式的DialogPreference,不同的是ListPreference提供單選列表,而在Android3.0之後可以通過MultiSelectListPreference來實現多選,所以他們的屬性和方法都幾乎是相同的,當然也包括使用基本語法,但是要注意一點由於要支持多選,所以MultiSelectListPreference的SharedPreferences保存的是集合set(我們應該有這個概念集合就是用於保存多個對象的),所以讀取數據的時候處理稍顯麻煩。

3.1、MultiSelectListPreference新增的方法

MultiSelectListPreference新增方法 說明 int findIndexOfValue(String value) 返回獲取ListPreference中的實體內容的下標值 CharSequence[] getEntries() 返回當前Preference 設置的entries集合(xml配置的字符串數據源) CharSequence[] getEntryValues() 返回當前的entries對應的value集合(xml配置的字符串數據源) Set getValues() 返回當前選中的values,SharedPreference的 void setEntries(int entriesResId)   void setEntries(CharSequence[] entries)   void setEntryValues(CharSequence[] entryValues)   void setEntryValues(int entryValuesResId)   void setValues(Set values)  

3.2、MultiSelectListPreference應用

還是使用一樣的數據源,一樣的xml(把ListPreference改為MultiSelectListPreference其他不變)

public class MutilListPreferenceActivity extends PreferenceActivity implements OnPreferenceChangeListener {
    private MultiSelectListPreference preference;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.list_preference);
        preference= (MultiSelectListPreference) findPreference("key_listpreference");
        preference.setOnPreferenceChangeListener(this);
        initFromSharedPreferences();
    }
    private void initFromSharedPreferences(){
        String summary=null;
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        Setoptions = prefs.getStringSet("key_listpreference", null);  //因不設置初始值,所以要進行null的判斷
        if(options!=null) {
            CharSequence[] extras = preference.getEntries();
            for (String op : options) {
                int index = preference.findIndexOfValue(op);
                if (summary==null) {
                   summary="";
                }
                summary = summary + extras[index];            }
            preference.setSummary(summary);
        }
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        if(preference instanceof MultiSelectListPreference) {
            String summary=null;
            MultiSelectListPreference multiSelectListPreference=(MultiSelectListPreference)preference;
            CharSequence[] extras =  multiSelectListPreference.getEntries();

            Set options=(Set)newValue;
            for (String op : options){
                int index = multiSelectListPreference.findIndexOfValue(op);
                Log.d("TAG2", op + extras[index]);
                if(summary==null) {
                    summary="";
                }
                summary = summary + extras[index];
            }
            Log.d("TAG2","onPreferenceChange:::"+summary);
            multiSelectListPreference.setSummary(summary);
        }
        return true;
    }
}
/**Log
*01-10 10:31:57.233 6089-6089/com.crazymo.prerencescreen D/TAG2: 1Dota2
01-10 10:31:57.234 6089-6089/com.crazymo.prerencescreen D/TAG2: 2NBA2K10
01-10 10:31:57.234 6089-6089/com.crazymo.prerencescreen D/TAG2: onPreferenceChange:::Dota2NBA2K10
*/

這裡寫圖片描述

三、TwoStatePreference系

TwoStatePreference也是一個抽象類,作用如字面意思。是基於兩種可選狀態的首選項基類,他沒有新增獨特的屬性,全都是繼承上級,在SharedPreferences裡通過維護一個布爾值(checked時為true)來設置當前狀態的啟用和禁止的一種Preference。Android也為我們提供了兩種:CheckBox選擇項CheckBoxPreference和 開關選擇SwitchPreference供我們直接使用。

1、TwoStatePreference的共性

TwoStatePreference系獨有方法 說明 CharSequence getSummaryOff() 獲取unchecked狀態下summary的值 CharSequence getSummaryOn() 獲取checked狀態下summary的值 boolean isChecked() 獲取是否checked void setChecked(boolean checked) 設置checked狀態 void setSummaryOff 設置unchecked下summary的值,可以通過字符串id和字符串 void setSummaryOn 設置checked下summary的值,可以通過字符串id和字符串

2、TwoStatePreference的應用與管理

1、CheckBoxPreference

1.1、CheckBoxPreference新增的屬性

CheckBoxPreference新增屬性 說明 android:summaryOff uncheck時的summary android:summaryOn check時的summary

1.2、CheckBoxPreference應用

res/xml/widget_layout.xml


    


    
    

每次點擊的時候先執行onChange再執行onClick

01-10 11:16:56.459 31292-31292/com.crazymo.prerencescreen D/TAG2: true
01-10 11:16:56.464 31292-31292/com.crazymo.prerencescreen D/TAG2: CheckBox Clicked!!
01-10 11:36:19.660 31292-31292/com.crazymo.prerencescreen D/TAG2: false
01-10 11:36:19.662 31292-31292/com.crazymo.prerencescreen D/TAG2: CheckBox Clicked!!

這裡寫圖片描述

2、SwitchPreference

2.1、SwitchPreference新增屬性

CheckBoxPreference新增屬性 說明 android:summaryOff uncheck時的summary android:summaryOn check時的summary android:switchTextOff   android:switchTextOn  

2.2、SwitchPreference應用

每次點擊的時候先執行onChange再執行onClick

01-10 11:47:55.554 12915-12915/com.crazymo.prerencescreen D/TAG2: true
01-10 11:47:55.559 12915-12915/com.crazymo.prerencescreen D/TAG2: SwitchPrefeence Clicked

這裡寫圖片描述

小結

通過這兩篇文章我們終於把Preference的應用和一些簡單原理給弄清楚了,其實這並不需要我們去背語法或者api什麼的,我們要從原理去理解,從他們的結構關系去理解,究其根本。Preference只不過是把自己的key作為SharedPreferences裡的key保存數據,進而再再次進入界面的時候由Activity去自動讀取並刷新UI,不同的Preference保存的SharedPreferences格式不一樣,比如說TwoStatePreference保存的是boolean的鍵值對,ListPreference則保存普通的字符串鍵值對;MultiSelectListPreference由於要保存多組數據則采取的是保存set集合等等,原理可以歸結為兩步:SharedPreferences的數據保存和PreferenceActivity讀取SharedPrefences的數據並更新。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved