继续创作,加速成长!这是我参与「日新计划 10 月更文应战」的第13天,点击检查活动概况

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

历史文章

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

设置项分组

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

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <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>
</PreferenceScreen>

咱们看下显现作用:

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

动态控制Preference设置项显隐

设置界面中很简单碰到这样一个场景:某个设置项满足必定条件再进行显现,默许躲藏该设置项,接下来看下怎么完成。

在xml中经过app:isPreferenceVisible特点设置显,咱们就设置该特点为 false,默许躲藏设置项:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <SwitchPreferenceCompat
        app:icon="@drawable/ic_launcher_background"
        app:key="display"
        app:isPreferenceVisible="false"
        app:summary="显现一些内容"
        app:title="显现" />
</PreferenceSrceeen>

然后在代码中依据app:key的特点值动态拿到SwitchPreferenceCompat这个设置项:

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

中心是调用findPreference()办法拿到设置项,然后调用isVisible特点动态控制显隐。


动态更新摘要summary

这个摘要指的便是:

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

普通摘要更新

直接调用Preferenc.setSummary()更新即可,比方咱们常用的一个设置项,显现当前应用的版别号:

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

看下显现作用:

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

SimpleSummaryProvider更新摘要

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

这个直接运用EditTextPreference自带的SimpleSummaryProvider即可,默许开关时封闭的,咱们能够经过xml中装备特点app:useSimpleSummaryProvider="true"即可:

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

咱们看下显现作用:

  • 当前默许显现的文本为明天更好
筑基篇:设置界面的开发利器Preference Library,了解一下~
  • 点击设置项弹出弹窗,修改文本
筑基篇:设置界面的开发利器Preference Library,了解一下~
  • 点击承认后,摘要文本会被动态更新
筑基篇:设置界面的开发利器Preference Library,了解一下~

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

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

自定义SummaryProvider

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

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

自定义SummaryProvider目标,每当点击设置项从弹窗中修改文本时,点击承认dismiss弹窗后,都会触发该目标的执行,从而将该目标办法返回的文本内显现到摘要上。

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

咱们看下显现作用:

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

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

切记,千万不要在自定义的SummaryProvider中调用getSummary()办法,不然就会形成栈溢出的反常,因为getSummary()又会触发自定义的SummaryProvider的调用。

自定义EditTextPreference修改弹窗

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

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

那假如咱们想要对这个输入修改框进行一个定制化操作:约束只能输入数字、文本内容为空时显现默许hint、约束可输入的字符数量等等,就能够经过setOnBindEditTextListener{}完成:

findPreference<EditTextPreference>("version")?.let {
    it.setOnBindEditTextListener { et: EditText ->
        //设置默许hint
        et.setHint("请输入一些数字")
    }
}

经过setOnBindEditTextListener{}咱们就拿到这个输入修改框的实例目标EditText,拿到这个咱们岂不是想干啥就能该干啥哈哈。

咱们看下上面例子的显现作用:

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

显现了默许设置的Hint提示。

总结

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

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

  • 动态控制Preference设置项:中心便是调用findPreference()经过app:key拿到xml中装备的设置项的引证,然后就能够进行任何动态操作;

  • 动态更新摘要:经过更新摘要的三种办法,更好的定制化摘要的显现,提高开发者的效率

  • 自定义EditTextPreference修改弹窗:更好的依据事务需求定制化输入修改框,满足你方方面面的需求;

希望本篇能对你有所协助,假如感觉还不错,能够点个赞支持下。