继续创作,加速成长!这是我参与「日新计划 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
修改弹窗:更好的依据事务需求定制化输入修改框,满足你方方面面的需求;
希望本篇能对你有所协助,假如感觉还不错,能够点个赞支持下。