持续创作,加速成长!这是我参与「掘金日新计划 · 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设置项显隐
设置界面中很容易碰到这样一个场景:某个设置项满足一定条件再进行显示,默认隐藏该设置项,接下来看下如何实现。
在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
这个摘要指的就是:
普通摘要更新
直接调用Preferenc.setSummary()更新即可,比如我们常用的一个设置项,显示当前应用的版本号:
<Preference
app:key="version"
app:title="版本" />
findPreference<Preference>("version")?.let {
it.summary = "5.0.122.004"
}
看下显示效果:
SimpleSummaryProvider更新摘要
上面更新的方式很简单,如果是EditTextPreference、ListPreference这种点击会弹出弹窗呢。比如我想使用EditTextPreference保存的文本显示在摘要中,并在保存的文本发生改变时,动态更新摘要的显示。
这个直接使用EditTextPreference自带的SimpleSummaryProvider即可,默认开关时关闭的,我们可以通过xml中配置属性app:useSimpleSummaryProvider="true"即可:
<EditTextPreference
app:key="version"
app:summary="Not Set"
app:title="版本"
app:useSimpleSummaryProvider="true" />
我们看下显示效果:
- 当前默认显示的文本为
明天更好
- 点击设置项弹出弹窗,编辑文本
- 点击确认后,摘要文本会被动态更新
同理ListPreference也提供了SimpleSummaryProvider,也需要手动开启,当点击设置项,触发显示弹窗列表并点击某条数据时,就会更新设置项的摘要
自定义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
}
}
我们看下显示效果:
一条非常非常非常重要的警告:
切记,千万不要在自定义的
SummaryProvider中调用getSummary()方法,否则就会造成栈溢出的异常,因为getSummary()又会触发自定义的SummaryProvider的调用。
自定义EditTextPreference编辑弹窗
从前面已经知道,当点击EditTextPreference对应的设置项,就会弹出一个编辑文本的弹窗:
那如果我们想要对这个输入编辑框进行一个定制化操作:限制只能输入数字、文本内容为空时显示默认hint、限制可输入的字符数量等等,就可以通过setOnBindEditTextListener{}实现:
findPreference<EditTextPreference>("version")?.let {
it.setOnBindEditTextListener { et: EditText ->
//设置默认hint
et.setHint("请输入一些数字")
}
}
通过setOnBindEditTextListener{}我们就拿到这个输入编辑框的实例对象EditText,拿到这个我们岂不是想干啥就能该干啥哈哈。
我们看下上面例子的显示效果:
显示了默认设置的Hint提示。
总结
文本主要是从以下四个方法对Preference Library进行了进一步的讲解:
-
设置项分组:使得不同设置项间界限分明,相同设置项之间更加"亲密";
-
动态控制
Preference设置项:核心就是调用findPreference()通过app:key拿到xml中配置的设置项的引用,然后就可以进行任何动态操作; -
动态更新摘要:通过更新摘要的三种方式,更好的定制化摘要的显示,提高开发者的效率;
-
自定义
EditTextPreference编辑弹窗:更好的根据业务需求定制化输入编辑框,满足你方方面面的需求;
希望本篇能对你有所帮助,如果感觉还不错,可以点个赞支持下。