PreferenceScreen 设置项

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

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

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w