PreferenceScreen 设置项
应用一般都有设置界面,这些通常通过SharedPreference保存在手机上(SharedPreference参考Android存储相关:SharedPreference),界面也要单独写。好在Android为我们提供了一个强大的设置界面PreferenceScreen。通过这个构建设置页面,点击界面切换设置的同时,后台也自动保存了相关数据。
1、PreferenceScreen
使用这个的时候需要注意,应当使用androidx.preference.PreferenceScreen,而不是android.preference.PreferenceScreen。后者已经被标记为deprecate。
1.1、AndroidX依赖
Android 10开始废弃PrefeceFragment和PreferenceScreen。移到了Androidx中,可以继续使用PreferenceScreen,推荐后面全部使用AndroidX包中的依赖。
//1.1.1和1.0.0有很大区别,为此踩了一天的坑!
implementation 'androidx.preference:preference:1.1.1'
1.2、设置布局文件
设置项一般先在res/xml文件夹中新建xml设置布局。

1.3、最佳学习Demo
AndroidStudio官方Demo:New->Activity->SettingsActivity 创建的默认设置Demo

2、常用设置项
介绍常用的设置项控件:PreferenceCategory(组)、EditTextPreference(输入项)、ListPreference(下拉选择)、MultiSelectListPreference(多选)、SwitchPreference(开关项)等。
2.1、PreferenceCategory
也就是设置项组,将相似的设置项放在同一个PreferenceCategory中,会用分割线相区分。
<PreferenceCategory app:title="设置组别1">
...
</PreferenceCategory>

2.2、EditTextPreference
点击该设置,会弹出一个输入框。
<EditTextPreferenc
app:key="signature"
app:title="输入"
app:useSimpleSummaryProvider="true" />

2.3、ListPreference
下拉列表选择设置项。
<ListPreference
app:defaultValue="reply"
app:entries="@array/reply_entries"
app:entryValues="@array/reply_values"
app:key="reply"
app:title="下拉选择"
app:useSimpleSummaryProvider="true" />
属性app:entries,定义了下拉选择显示的值,定义在values/array.xml中:
<string-array name="reply_entries">
<item>Reply</item>
<item>Reply to all</item>
</string-array>
属性app:entryValues,定义了下拉选择存储的值,也定义在values/array.xml中。
<string-array name="reply_values">
<item>reply</item>
<item>reply all</item>
</string-array>
两者选择一一对应。一定要保证app:entries和app:entryValues数组的长度一致,否则会出各种问题。


2.4、MultiSelectListPreference
和前者类似,都是列表选择,不过可以多选。

且值保存在SharedPreference中是集合set形式:
<set name="muti_select">
<string>reply all</string>
<string>reply</string>
</set>
2.5、SwitchPreference/SwitchPreferenceCompat
选择开关设置项,经常看到一些设置开关:“是否允许数据网络下载/播放”。
<SwitchPreferenceCompat
app:icon="@drawable/setting_icon_3"
app:key="download"
app:title="是否允许使用移动网络下载" />

开关相互依赖,app:dependency属性,选择所要依赖的开关键值
<SwitchPreferenceCompat
app:dependency="download"
app:iconSpaceReserved="false"
app:key="attachment"
app:summaryOff="不使用4G进行下载"
app:summaryOn="使用4G进行下载"
app:title="4G网络设置" />

①依赖开关的状态改变,不会改变后者的值,只是让其不可变更,变为“锁定”状态。
②注意使用开关依赖的时候,所依赖的键值一定要存在,否则会出错:所依赖的设置不存在。

3、设置项属性
有些属性需要使用app:而不是android:,否则设置的属性无效!
①app:icon
设置项的图标
②app:iconSpaceReserved="false/true"
是否保留设置项前面的icon位置,为false且没有设置icon时候会隐藏前面的区域
③app:title
设置组或者设置项的标题
④app:key
保存在/data/data/包名/shared_prefs/包名_preference.xml中的键值
⑤app:summaryOff、app:summaryOn
用在开关设置项SwitchPreferenceCompat中,开关开关状态对应不同的说明
⑥app:dependency
用于开关依赖,另一个SwitchPreferenceCompat的键值
⑦app:useSimpleSummaryProvider
一般为true
⑧app:summary
该设置项的摘要,显示在title底部。(如果需要显示在title右侧后边,可以自定义layout实现)
⑨app:defaultValue
Preference的默认值,根据Android定义的declare-styleable(参考自定义View属性)可以看到任意类型:
<!-- 首选项的默认值,如果关闭持久性或打开持久性并且在持久性存储中找不到该首选项,
则将设置该默认值。 -->
<attr format="string|boolean|integer|reference|float" name="defaultValue"/>
4、自定义Preference*
一般自定义layout即可,或者继承Preference定制。自定义Preference前后可能会自动加上divider分割线,可以手动禁掉:
<!-- Whether the preference allows displaying divider on top -->
<attr format="boolean" name="allowDividerAbove"/>
<!-- Whether the preference allows displaying divider below it -->
<attr format="boolean" name="allowDividerBelow"/>
推荐博客:
自定义Preference和PreferenceFragment修改
Android进阶——Preference详解之初识Preference及Preference系
Android进阶——Preference详解之Preference系的基本应用和管理
Android进阶——Preference详解之Preference系的基本应用(三)