Android 应用的下拉设置项到底怎么玩?

你盯着手机设置里的那些下拉菜单选项发过呆吗?就是那种点开能选”夜间模式”或者”字体大小”的小控件。其实这些看似简单的功能,在Android开发里有个专门的名字叫ListPreference,今天咱们就来把这个看似神秘的东西扒个底朝天。

先泼盆冷水啊,很多新手一听到”Preference”这个词就犯怵。别慌,说白了它就是用来保存用户设置的控件。比如你在应用里选了深色主题,下次打开还能保持这个选择,靠的就是这玩意儿在背后默默存数据。

从零开始搭架子

要弄明白ListPreference怎么用,得先搞懂它的生存环境。这货必须活在PreferenceFragmentCompat这个”房子”里,就像鱼得活在水里一样。咱们先在res目录下新建个xml文件夹,里面塞个preferences.xml文件。注意啊,这个文件名可不能乱起,得跟你后面调用的名字对上号。

xml <PreferenceScreen xmlns:app=”http://schemas.android.com/apk/res-auto”> <ListPreference app:key=”text_size” app:title=”字号设置” app:entries=”@array/text_size_options” app:entryValues=”@array/text_size_values” app:defaultValue=”16″/> </PreferenceScreen> 看着这一堆app:开头的属性是不是有点懵?别急,我挨个解释: – app:key:相当于身份证号,存数据取数据都靠它 – app:entries:显示给用户看的文字,比如”大号””中号””小号” – app:entryValues:实际存储的值,建议用数字或英文 – app:defaultValue:默认选中的值

数据源怎么搞

注意到上面用了@array/text_size_options吗?这得在res/values/arrays.xml里配好: “`xml 小号 中号 大号

14 16 18 “` 这里有个坑新手常踩——entries和entryValues的数量必须严格一致!要是对不上,程序分分钟崩溃给你看。

代码部分别手软

现在该写Java/Kotlin代码了。新建个SettingsFragment继承PreferenceFragmentCompat,重写onCreatePreferences方法: kotlin class SettingsFragment : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences, rootKey) } } 然后在Activity里加载这个Fragment。注意要用的不是普通Fragment,必须用PreferenceFragmentCompat,否则直接闪退没商量。

用户选了值之后怎么办?

这时候该OnPreferenceChangeListener出场了。给ListPreference加上监听: kotlin val textSizePref = findPreference<ListPreference>(“text_size”) textSizePref?.setOnPreferenceChangeListener { _, newValue -> // 这里能拿到用户选的值,比如”16″ true // 返回true表示接受这个更改 } 但有个更聪明的办法——直接用SharedPreferences监听。在Activity里注册监听器: kotlin PreferenceManager.getDefaultSharedPreferences(this) .registerOnSharedPreferenceChangeListener { sharedPreferences, key -> when (key) { “text_size” -> { val size = sharedPreferences.getString(key, “16”) // 更新UI或做其他操作 } } }

灵魂拷问环节

问:为什么我的列表选项显示不出来? 八成是arrays.xml里没配好,或者entries和entryValues数量不一致。还有个隐藏雷区——用数字当entryValues时记得用而不是,因为Preference系统只认字符串。

问:怎么动态修改列表内容? 这就要上骚操作了。先拿到ListPreference实例,然后修改entries和entryValues: kotlin val entries = arrayOf(“春天”, “夏天”, “秋天”, “冬天”) val values = arrayOf(“1”, “2”, “3”, “4”) textSizePref?.entries = entries textSizePref?.entryValues = values

问:存储的数据存在哪了? 默认存在SharedPreferences里,路径是/data/data/你的包名/shared_prefs/你的包名_preferences.xml。不过现在Android 11以后直接访问data目录受限,建议用Android Studio的Device File Explorer查看。

小编观点

说实话,ListPreference就像乐高积木里的基础块,看似简单但能组合出各种花样。新手最容易犯的错误就是急着赶进度,不仔细检查arrays.xml的配置。建议每次修改配置后先clean项目再运行,能避免很多玄学问题。现在很多新项目都用Jetpack Preference库了,但老项目的维护还是绕不开这玩意,把基础打牢了准没错。

本站文章由SEO技术博客撰稿人原创,作者:阿君创作,如若转载请注明原文及出处:https://www.ainiseo.com/hosting/16835.html

(0)
上一篇 2025 年 3 月 5 日 下午4:14
下一篇 2025 年 3 月 5 日 下午4:25

相关文章推荐

联系我

由于平时工作忙:流量合作还是咨询SEO服务,请简明扼表明来意!谢谢!

邮件:207985384@qq.com 合作微信:ajunboke

工作时间:周一至周六,9:30-22:30,节假日休息

个人微信
个人微信
分享本页
返回顶部