引言
很久沒來得及更新博客了,時間總是不夠,以前的知識還沒來得及總結完畢,新的知識又源源不斷地接觸到,工作也很忙,但還是沒有忘記自己最低點目標每個月至少四篇。好了,廢話就到這裏啦,開始進入正文,這篇文章如標題所言,(準確地來說應該需要好幾篇文章可能才能總結完畢吧)主題只有一個另一種構建UI的方式——通過Preference去構建UI,而不是直接通過layout方式(或許說得不夠準確,因爲Preference系也是間接通過Activity去展示的,只不過對於很多新人來說這種方式會和普通的有點不一樣)
一、Preference家族概述
如下圖所示Preference作爲該家族的終極基類,直接繼承Object,其他子類Preference直接或者間接繼承於Preference。他們的作用就是定義要顯示的UI(其實作用類似於普通的Layout佈局文件),特殊之處在於定義好了UI之後再在PreferenceActivity裏以ListView的形式整體佈局,每一個子Preference相當於是一個列表項。另外Preference還提供了一個SharedPreference用於保存/讀取數據,以其key屬性作爲SharedPreference的鍵。還有一點Preference所存儲的數據最後都會以xml文件格式的形式進行保存,而且其只能 保存一些基本格式的數據。例如string/boolean等等。該xml文件存放的位置在data/data/你應用的包名/shared_prefs 文件夾下。
二、Preference重要的家族成員
1、Preference
1.1、重要的回調接口和方法
接口(方法) | 說明 |
---|---|
public static interface Preference.OnPreferenceChangeListener | 當對應的首選項的值改變時觸發該接口的回調 |
public static interface Preference.OnPreferenceClickListener | 當點擊Prefrence時觸發該接口的回調 |
abstract boolean onPreferenceChange(Preference preference, Object newValue) | OnPreferenceChangeListener接口裏對應的回調方法 |
abstract boolean onPreferenceClick(Preference preference) | OnPreferenceClickListener接口對應的回調方法 |
簡單來說就是當我們點擊或者首選項值改變時候會分別觸發這兩個方法。
1.2、重要的方法和屬性
這些重要的公開方法或者接口都將被繼承到其子類Preference下發揮重要的作用,所以又必要去眼熟下(我們都知道JavaBean中一般都是getter和setter成對出現的,爲了節約篇幅就沒有把所有的都列出來,還有父類的一些屬性也沒有全部列出,下同)
公共方法(屬性) | 說明 |
---|---|
Preference(Context context, AttributeSet attrs, int defStyle) | |
Preference(Context context, AttributeSet attrs) | |
android:key | key屬性,可以唯一辨識同一容器內的Preference |
android:title | 標題 |
android:summary | Preference裏的第二行的描述說明位於title下 |
Context getContext() | 獲取當前的上下文對象 |
SharedPreferences.Editor getEditor() | 獲取對應的SharedPreferences的Editor對象 |
void setFragment() | 設置要顯示的Fragment |
void setIcon(Drawable icon)/setIcon(int iconResId) | 設置Preference的icon |
void setIntent(Intent intent) | 當點擊Preference時執行startActivity(intent)裏的intent對象 |
void setOnPreferenceChangeListener(Preference.OnPreferenceChangeListener listener) | 設置監聽 |
void setOnPreferenceClickListener(Preference.OnPreferenceClickListener listener) | 設置點擊監聽 |
void setSummary(int summaryResId)/setSummary(CharSequence summary) | 設置summary |
void setKey(String key) | 設置對應的key |
void setLayoutResource(int layoutResId) | 設置Preference的佈局 |
protected void onBindView(View view) | 綁定數據 |
protected View onCreateView(ViewGroup parent) | 建立Preference的佈局類似Fragement裏的 |
protected void onAttachedToActivity() | 與附着的Activity對接時也是與Fragement裏的類似 |
void notifyChanged() | 當Preference裏的值改變時候,可以手動調用這個方法去通知系統進行相關的更新,類似ListView裏的 |
2、PreferenceGroup
PreferenceGroup是直接繼承於Preference,起到的是一個容器作用,類似於ViewGroup的功能,我們在日常開發中接觸最多的是他的子類 PreferenceCategory 和PreferenceScreen,這兩個直接繼承PreferenceGroup所以在開發中起的作用也是容器,用於”安置“其他子Preference的容器。值得注意的是除了繼承一些來自Preference及其他父類公共的方法還繼承了一些公共屬性。
公共方法(屬性) | 說明 |
---|---|
PreferenceGroup(Context context, AttributeSet attrs, int defStyle) | |
PreferenceGroup(Context context, AttributeSet attrs) | |
void addItemFromInflater(Preference preference) | 當Preference被添加到當前容器時被調用 |
Preference findPreference(CharSequence key) | 通過key屬性找到對應的Preference,同一容器內key應該唯一 |
int getPreferenceCount() | 獲取容器內Preference的數量 |
void removeAll() | 刪除所有容器內的Preference |
boolean removePreference(Preference preference) | 刪除所有容器內的指定的Preference |
boolean onPrepareAddPreference(Preference preference) | 添加Preference之前執行 |
3、public final class PreferenceScreen
以上兩個家族成員,我們在普通的開發中一般都是不會直接使用的,當人如果自定義Preference可能會涉及到,我們看到做多的應該是PreferenceScreen和PreferenceCateGory,首先按照官網描述,PreferenceScreen在一個Preference的層級結構中是作爲top-level頂級層次的,類似於普通佈局中的各種Layout,LinearLayout、RelativeLayout等等,他繼承於PreferenceGroup,所以同樣起的容器的作用。同樣的我們除了可以通過xml方式構造PreferenceScreen還可以通過createPreferenceScreen(Context)(後面文章再說具體用法)。
3.1、PreferenceScreen的功能
- 作爲一個PreferenceAcitivity的基本佈局的根容器:和其他根Layout一樣,是不可見的容器,只是把容器內的Preference呈現出來
- 嵌套插入在其他PreferenceScreen容器裏
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="first_preferencescreen">
<CheckBoxPreference
android:key="wifi enabled"
android:title="WiFi" />
<PreferenceScreen
android:key="second_preferencescreen"
android:title="WiFi settings">
<CheckBoxPreference
android:key="prefer wifi"
android:title="Prefer WiFi" />
... other preferences here ...
</PreferenceScreen>
</PreferenceScreen>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
3.2、重要的方法和屬性
公共方法(屬性) | 說明 |
---|---|
void bind(ListView listView) | Binds a ListView to the preferences contained in this PreferenceScreen via getRootAdapter(). |
Dialog getDialog() | Used to get a handle to the dialog. |
ListAdapter getRootAdapter() | Returns an adapter that can be attached to a PreferenceActivity or PreferenceFragment to show the preferences contained in this PreferenceScreen. |
void onItemClick(AdapterView parent, View view, int position, long id) | |
void onDismiss(DialogInterface dialog) | This method will be invoked when the dialog is dismissed. |
protected void onClick() | Processes a click on the preference. |
protected ListAdapteronCreateRootAdapter() | Creates the root adapter. |
Parcelable onSaveInstanceState() | Hook allowing a Preference to generate a representation of its internal state that can later be used to create a new instance with that same state. |
4、public class PreferenceCategory
PreferenceCategory也是繼承於PreferenceGroup,所以他也具有容器的功能,不過一般不用做頂級容器,可用於二級容器嵌套在PreferenceScreen裏提供分組的作用,和數據庫SQL中的group by差不多。
5、public abstract class DialogPreference
DialogPreference直接繼承自Preference,它的獨特之處在於它是基於Dialog的,也就是說但我們點擊對應的DialogPreference系時是以Dialog形式展現的,又因它是一個abstract抽象類,所以更多的時候我們直接使用它的子類:EditTextPreference、ListPreference和MultiSelectListPreference
DialogPreference系公共方法(屬性) | 說明 |
---|---|
android:dialogIcon | 對話框的icon |
android:dialogLayout | dialog 的contentView 佈局 |
android:dialogMessage | 對話框的內容 |
android:dialogTitle | 對話框的標題 |
android:negativeButtonText | 對話框裏的按鈕1名稱 |
android:positiveButtonText | 對話框裏的按鈕2名稱 |
DialogPreference(Context context, AttributeSet attrs, int defStyle) | |
DialogPreference(Context context, AttributeSet attrs) | |
void onActivityDestroy() | 當Activity destroy時觸發 |
void onClick(DialogInterface dialog, int which) | 對話框統一的回調方法,可以通過which來判斷點擊的是哪個按鈕 |
void onDismiss(DialogInterface dialog) | 但對話框消失時 |
一系列對應xml屬性的setter和getter方法略… | |
protected void onBindDialogView(View view) | 綁定數據 |
protected void onClick() | 處理onClick事件 |
protected View onCreateDialogView() | 建立Dialog的contentView |
protected void onDialogClosed(boolean positiveResult) | 當dialog 消失時,常被用於保存數據到SharedPreferences |
protected void onPrepareDialogBuilder(AlertDialog.Builder builder) | 當Preference被點擊前,dialog顯示之前觸發 |
protected void onRestoreInstanceState(Parcelable state) | 恢復在onSaveInstanceState保存的數據 |
protected Parcelable onSaveInstanceState() | 保存狀態 |
protected void showDialog(Bundle state) | 顯示關聯的dialog |
5、public abstract class TwoStatePreference
TwoStatePreference和DialogPreference同級,都是直接繼承自Preference。TwoStatePreference如字面意思,是基於兩種可選狀態的首選項基類,在SharedPreferences裏通過維護一個布爾值來設置當前狀態的啓用和禁止的一種Preference。
TwoStatePreference系公共方法 | 說明 |
---|---|
TwoStatePreference(Context context, AttributeSet attrs, int defStyle) | |
TwoStatePreference(Context context, AttributeSet attrs) | |
TwoStatePreference(Context context) | |
CharSequence getSummaryOff() | 獲取當未check時顯示的summary |
CharSequence getSummaryOn() | 獲取checked時顯示的summary |
void setSummaryOff(CharSequence summary)/(int summaryResId) | |
void setSummaryOn(CharSequence summary)/(int summaryResId) | |
boolean isChecked() | |
void setChecked(boolean checked) | |
protected void onClick() | 處理onclick |
Object onGetDefaultValue(TypedArray a, int index) | 當Preference的佈局文件被映射和需要讀取默認值時被調用 |
protected void onRestoreInstanceState(Parcelable state) | |
protected Parcelable onSaveInstanceState() | |
protected void onSetInitialValue(boolean restoreValue, Object defaultValue) | 設置首選項的初值 |
6、EditTextPreference、ListPreference和MultiSelectListPreference
作爲DialogPreference的直接子類,這些子類Preference肯定擁有了DialogPreference的一切共性和特點,第一個肯定還是以Dialog的形式彈出,區別在於彈出的界面構成和其他的特性,這些在我們以後在開發中經常使用到,暫不詳講。
小結
這一篇也是Preference的基本知識,主要是爲了對於Preference家族的基本構成體系和基本特點概念有所瞭解,下幾篇文章再針對各子類的應用及後面的自定義Preference和擴展系統Preference做詳細總結。