PreferenceScreen 设置项

QuibblerQuibbler 2020-01-18 约 10 分钟 4275 次阅读

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系的基本应用(三)

相关推荐

WilliamChart:轻量美观的 Android 图表库实战
精选开源

WilliamChart:轻量美观的 Android 图表库实战

WilliamChart:轻量美观的 Android 图表库实战数据可视化是运动、健康、金融、统计类 App 的刚需。MPAndroidChart 功能最全但偏重复杂,WilliamChart 走的则是"轻量 + 美观 + Kotlin 原生"路线——v3 用 Kotlin 完全重写,API 极简,一行 chart.animate(dataSet) 就能把数据画成带动画的折线/柱状/环形图,开箱即

175