You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实例:

  1. 先修改SeekBarPreference的key为语义化名称,方便后续读取:
<SeekBarPreference
    android:key="global_text_size"
    app:defaultValue="16"
    app:min="12"
    app:max="24"
    app:showSeekBarValue="true"
    app:title="全局文字大小" />
  1. 在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
    }
}
  1. 在业务页面读取字号配置:
// 读取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,可通过两种方式获取状态:

  1. 实时监听开关变化(设置页内即时生效):
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
    }
}
  1. 全局任意位置读取开关状态:
val sp = PreferenceManager.getDefaultSharedPreferences(context)
// 默认震动开启,默认值可根据需求修改
val isVibrateEnabled = sp.getBoolean("sync", true)
// 业务逻辑中判断是否执行震动
if (isVibrateEnabled) {
    // 执行震动操作
}

内容的提问来源于stack exchange,提问作者AmirHossein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:45:05