Kotlin SettingsFragment自定义布局、SharedPreferences使用及开关逻辑咨询
Android Settings Fragment 自定义与功能实现解决方案
问题1:PreferenceCategory标题设置居中
提供两种可落地的实现方式:
- 方式1:自定义样式全局生效
在res/values/styles.xml中添加自定义样式,关联到App主题即可全局生效:
<!-- 自定义PreferenceCategory样式 --> <style name="CustomPreferenceCategory" parent="Preference.Category"> <item name="android:gravity">center</item> <item name="android:textAlignment">center</item> <item name="android:layout_width">match_parent</item> </style>
在你的App主题中添加配置关联样式:
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <!-- 保留原有其他配置 --> <item name="preferenceCategoryStyle">@style/CustomPreferenceCategory</item> </style>
- 方式2:代码动态修改单个Category样式
如果只需要单个分类标题居中,先在root_preferences.xml中给对应分类设置key:
<PreferenceCategory app:key="message_header_category" app:title="@string/messages_header">
然后在SettingsFragment的onCreatePreferences方法中添加逻辑:
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.root_preferences, rootKey) // 找到对应分类 val messageCategory = findPreference<PreferenceCategory>("message_header_category") messageCategory?.setOnBindPreferenceViewHolderListener { holder -> // 拿到标题控件设置居中 val titleView = holder.itemView.findViewById<TextView>(android.R.id.title) titleView.gravity = Gravity.CENTER titleView.textAlignment = View.TEXT_ALIGNMENT_CENTER } }
问题2:SharedPreferences使用与全局文字大小调整
Preference组件默认使用DefaultSharedPreferences存储数值,无需额外创建SP实例:
- 先修改
SeekBarPreference的key为语义化名称,方便后续读取:
<SeekBarPreference android:key="global_text_size" app:defaultValue="16" app:min="12" app:max="24" app:showSeekBarValue="true" app:title="全局文字大小" />
- 在
SettingsFragment中监听滑块变化:
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.root_preferences, rootKey) val textSizePref = findPreference<SeekBarPreference>("global_text_size") textSizePref?.setOnPreferenceChangeListener { _, newValue -> // newValue为用户选中的字号,单位为sp val size = newValue as Int // 可在此发送全局事件通知所有页面更新文字大小 true } }
- 在业务页面读取字号配置:
// 读取SP中的字号,默认值16sp可自行修改 val sp = PreferenceManager.getDefaultSharedPreferences(context) val textSize = sp.getInt("global_text_size", 16) // 给TextView设置大小 textView.textSize = textSize.toFloat()
如果需要全局即时生效,建议在BaseActivity中注册SharedPreferences变化监听,所有继承BaseActivity的页面收到变化后统一更新文字大小即可。
问题3:震动开关状态控制
你当前震动开关的key为sync,可通过两种方式获取状态:
- 实时监听开关变化(设置页内即时生效):
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.root_preferences, rootKey) val vibrateSwitch = findPreference<SwitchPreferenceCompat>("sync") vibrateSwitch?.setOnPreferenceChangeListener { _, newValue -> val isEnabled = newValue as Boolean if (isEnabled) { // 执行开启震动逻辑 } else { // 执行关闭震动逻辑 } true } }
- 全局任意位置读取开关状态:
val sp = PreferenceManager.getDefaultSharedPreferences(context) // 默认震动开启,默认值可根据需求修改 val isVibrateEnabled = sp.getBoolean("sync", true) // 业务逻辑中判断是否执行震动 if (isVibrateEnabled) { // 执行震动操作 }
内容的提问来源于stack exchange,提问作者AmirHossein
相关产品推荐
相关产品推荐

