筑基篇:设置界面的开发利器Preference Library,了解一下~

语言: CN / TW / HK

highlight: vs theme: devui-blue


持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情

接下来会对Preference Library官方库进行一个系列讲解,本篇文章是Preference Library系列的第二篇,主要是介绍Preference Library进阶使用:如何动态操作Preference组件,自定义一些设置等。

历史文章

练气篇:设置界面的开发利器Preference Library,了解一下~

设置项分组

这个比较简单,在日常开发中,很多设置项都是分组的,某几个设置项属于这个分类,另几个设置项属于那个分类,这个直接通过在xml中配置PreferenceCategory即可:

```xml

<PreferenceCategory
    app:key="fenlei1"
    app:title="分类1">
    <SwitchPreferenceCompat
        app:icon="@drawable/ic_launcher_background"
        app:key="display"
        app:summary="显示一些内容"
        app:title="显示" />

</PreferenceCategory>

<PreferenceCategory
    android:layout_width="match_parent"
    app:key="fenlei2"
    app:title="分类2">
    <CheckBoxPreference
        app:key="select"
        app:summary="请选择一些内容"
        app:title="选择" />

    <ListPreference
        app:entries="@array/list"
        app:entryValues="@array/list"
        app:key="list"
        app:summary="下面是一个列表"
        app:title="列表" />
</PreferenceCategory>

```

我们看下显示效果:

image.png

动态控制Preference设置项显隐

设置界面中很容易碰到这样一个场景:某个设置项满足一定条件再进行显示,默认隐藏该设置项,接下来看下如何实现。

在xml中通过app:isPreferenceVisible属性设置显,我们就设置该属性为 false,默认隐藏设置项:

```xml

<SwitchPreferenceCompat
    app:icon="@drawable/ic_launcher_background"
    app:key="display"
    app:isPreferenceVisible="false"
    app:summary="显示一些内容"
    app:title="显示" />

```

然后在代码中根据app:key的属性值动态拿到SwitchPreferenceCompat这个设置项:

kotlin override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.settings, rootKey) findPreference<SwitchPreferenceCompat>("display")?.let { //根条件动态判断是否显示该设置项 it.isVisible = true/false } }

核心是调用findPreference()方法拿到设置项,然后调用isVisible属性动态控制显隐。


动态更新摘要summary

这个摘要指的就是:

image.png

普通摘要更新

直接调用Preferenc.setSummary()更新即可,比如我们常用的一个设置项,显示当前应用的版本号:

xml <Preference app:key="version" app:title="版本" /> kotlin findPreference<Preference>("version")?.let { it.summary = "5.0.122.004" }

看下显示效果:

1665759649128.png

SimpleSummaryProvider更新摘要

上面更新的方式很简单,如果是EditTextPreferenceListPreference这种点击会弹出弹窗呢。比如我想使用EditTextPreference保存的文本显示在摘要中,并在保存的文本发生改变时,动态更新摘要的显示。

这个直接使用EditTextPreference自带的SimpleSummaryProvider即可,默认开关时关闭的,我们可以通过xml中配置属性app:useSimpleSummaryProvider="true"即可:

xml <EditTextPreference app:key="version" app:summary="Not Set" app:title="版本" app:useSimpleSummaryProvider="true" />

我们看下显示效果:

  • 当前默认显示的文本为明天更好

image.png

  • 点击设置项弹出弹窗,编辑文本

image.png

  • 点击确认后,摘要文本会被动态更新

image.png

同理ListPreference也提供了SimpleSummaryProvider,也需要手动开启,当点击设置项,触发显示弹窗列表并点击某条数据时,就会更新设置项的摘要

image.png

image.png

自定义SummaryProvider

有这样一个场景,比如我们想要EditTextPreference摘要动态显示保存的文本的长度,而不是默认的文本内容,这个该怎么实现呢?很简单,自定义一个SummaryProvider即可。

xml <EditTextPreference app:key="version" app:summary="Not Set" app:title="版本" />

自定义SummaryProvider对象,每当点击设置项从弹窗中编辑文本时,点击确认dismiss弹窗后,都会触发该对象的执行,进而将该对象方法返回的文本内显示到摘要上。

kotlin findPreference<EditTextPreference>("version")?.let { it.summaryProvider = Preference.SummaryProvider<EditTextPreference> { etp -> return@SummaryProvider "文本内容长度为:" + etp.text?.length } }

我们看下显示效果:

image.png

image.png

一条非常非常非常重要的警告

切记,千万不要在自定义的SummaryProvider中调用getSummary()方法,否则就会造成栈溢出的异常,因为getSummary()又会触发自定义的SummaryProvider的调用。

自定义EditTextPreference编辑弹窗

从前面已经知道,当点击EditTextPreference对应的设置项,就会弹出一个编辑文本的弹窗:

image.png

那如果我们想要对这个输入编辑框进行一个定制化操作:限制只能输入数字、文本内容为空时显示默认hint、限制可输入的字符数量等等,就可以通过setOnBindEditTextListener{}实现:

kotlin findPreference<EditTextPreference>("version")?.let { it.setOnBindEditTextListener { et: EditText -> //设置默认hint et.setHint("请输入一些数字") } }
通过setOnBindEditTextListener{}我们就拿到这个输入编辑框的实例对象EditText,拿到这个我们岂不是想干啥就能该干啥哈哈。

我们看下上面例子的显示效果:

image.png

显示了默认设置的Hint提示。

总结

文本主要是从以下四个方法对Preference Library进行了进一步的讲解:

  • 设置项分组:使得不同设置项间界限分明,相同设置项之间更加"亲密";

  • 动态控制Preference设置项:核心就是调用findPreference()通过app:key拿到xml中配置的设置项的引用,然后就可以进行任何动态操作;

  • 动态更新摘要:通过更新摘要的三种方式,更好的定制化摘要的显示,提高开发者的效率;

  • 自定义EditTextPreference编辑弹窗:更好的根据业务需求定制化输入编辑框,满足你方方面面的需求;

希望本篇能对你有所帮助,如果感觉还不错,可以点个赞支持下。