[TOC]
前言
自己獨立開發過了比較多的app,發現關於設定的UI和相關的處理自己寫不旦增加類開發工作量,而且常常會使整個程式碼層次和邏輯會變的相當混亂,讓人頭痛,在不考慮自己花時間弄一個設定管理類管理好設定程式碼,及自己處理各種UI控制元件的前提下,使用官方提供的Preference是最優也是最高效的選擇;
Android Preference 提供的控制元件
這裡只列舉常用的support.v7,其他的也大同小異 引入方式,gradle 下配置
com.android.support:preference-v7:27.1.1
複製程式碼
官方總結-科學上網, 使用的時候查詢對應屬性設定
↳ android.support.v7.preference.Preference
↳ Known Direct Subclasses
DialogPreference,PreferenceGroup,SeekBarPreference,TwoStatePreference
Known Indirect Subclasses
CheckBoxPreference,DropDownPreference,EditTextPreference,ListPreference, MultiSelectListPreference,PreferenceCategory,PreferenceScreen, SwitchPreference, SwitchPreferenceCompat
Xml案例(For example:):
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference
android:key="pref_sync"
android:title="@string/pref_sync"
android:summary="@string/pref_sync_summ"
android:defaultValue="true" />
<ListPreference
android:dependency="pref_sync"
android:key="pref_syncConnectionType"
android:title="@string/pref_syncConnectionType"
android:dialogTitle="@string/pref_syncConnectionType"
android:entries="@array/pref_syncConnectionTypes_entries"
android:entryValues="@array/pref_syncConnectionTypes_values"
android:defaultValue="@string/pref_syncConnectionTypes_default" />
</PreferenceScreen>
複製程式碼
Java 案例:
public class SettingsActivity extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
public class SettingsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Display the fragment as the main content.
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new SettingsFragment())
.commit();
}
}
複製程式碼
不同版本大致區別
- v14 Preference Support Library
com.android.support:preference-v14:27.1.1
增加了 PreferenceFragment.OnPreferenceStartFragmentCallback 和PreferenceFragment.OnPreferenceStartScreenCallback, 更新了一些類, 如:`MultiSelectListPreference and PreferenceFragment - v17 Preference 主要是增加了對TV的支援;
具體流程
注意: findPreference/onPreferenceTreeClick 等方法在android.preference.PreferenceActivity Api16 (4.1) 中被棄用,在PreferenceFragmentCompat中能正常使用,故官方推薦使用PreferenceFragmentCompat;
新建xml
使用組(Group)
案例:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="@string/pref_sms_storage_title"
android:key="pref_key_storage_settings">
<CheckBoxPreference
android:key="pref_key_auto_delete"
android:summary="@string/pref_summary_auto_delete"
android:title="@string/pref_title_auto_delete"
android:defaultValue="false"... />
<Preference
android:key="pref_key_sms_delete_limit"
android:dependency="pref_key_auto_delete"
android:summary="@string/pref_summary_delete_limit"
android:title="@string/pref_title_sms_delete"... />
<Preference
android:key="pref_key_mms_delete_limit"
android:dependency="pref_key_auto_delete"
android:summary="@string/pref_summary_delete_limit"
android:title="@string/pref_title_mms_delete" ... />
</PreferenceCategory>
...
</PreferenceScreen>
複製程式碼
使用子螢幕(subscreens)
案例程式碼:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- opens a subscreen of settings -->
<PreferenceScreen
android:key="button_voicemail_category_key"
android:title="@string/voicemail"
android:persistent="false">
<ListPreference
android:key="button_voicemail_provider_key"
android:title="@string/voicemail_provider" ... />
<!-- opens another nested subscreen -->
<PreferenceScreen
android:key="button_voicemail_setting_key"
android:title="@string/voicemail_settings"
android:persistent="false">
...
</PreferenceScreen>
<RingtonePreference
android:key="button_voicemail_ringtone_key"
android:title="@string/voicemail_ringtone_title"
android:ringtoneType="notification" ... />
...
</PreferenceScreen>
...
</PreferenceScreen>
複製程式碼
使用intents
<Preference android:title="@string/prefs_web_page" >
<intent android:action="android.intent.action.VIEW"
android:data="http://www.example.com" />
</Preference>
複製程式碼
屬性有:
- android:action
- android:data
- android:mimeType
- android:targetClass
- android:targetPackage
請注意:上面的設定已經夠日常使用
處理
讀
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String syncConnPref = sharedPref.getString(SettingsActivity.KEY_PREF_SYNC_CONN, "");
複製程式碼
監聽
- findPreference裡面的引數就是我們使用android:key所定義
- onPreferenceTreeClick Prefs tree點選時呼叫 註冊方式:
@Override
protected void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(this);
}
複製程式碼
設定監聽方式:
SharedPreferences.OnSharedPreferenceChangeListener listener =
new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
// listener implementation
}
};
prefs.registerOnSharedPreferenceChangeListener(listener);
複製程式碼
使用小案例
還原初始設定
PreferenceManager.setDefaultValues(Context, R.xml.advanced_preferences, false);
複製程式碼
- false : 首次呼叫生效;(true 每次呼叫都生效)
麵包原材料
- Develop Guide Settings 【主要.科學上網】
- Android Preference 設定全攻略 其實看這個也可以