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

如何将现有Preference代码升级至AndroidX偏好库?

简洁AndroidX偏好库升级方案

1. 添加依赖

首先在模块的build.gradle(或build.gradle.kts)中引入AndroidX偏好库:

implementation "androidx.preference:preference-ktx:1.2.1"
// 可替换为最新版本号

2. 调整偏好项封装类

原PreferenceItem类只需微调获取SharedPreferences的方式,保持原有简洁性:

import android.content.Context
import androidx.preference.PreferenceManager

class PreferenceItem<T>(val key: String, val default: T) {
    @Suppress("UNCHECKED_CAST")
    fun read(context: Context): T {
        val prefs = PreferenceManager.getDefaultSharedPreferences(context)
        return when (default) {
            is Boolean -> prefs.getBoolean(key, default) as T
            is String -> prefs.getString(key, default) as T
            // 可根据需要扩展其他类型(如Int、Float等)
            else -> prefs.all[key] as T
        }
    }
}

enum class CoordRep { LATLNG, UTM }

class MyPreferences(context: Context) {
    val coordSys = PreferenceItem("COORD_SYS", CoordRep.LATLNG.name)
    val showSmoothVideo = PreferenceItem("SHOW_SMOOTH_VIDEO", true)
}

注:这里把CoordRep默认值改为枚举名称字符串,避免直接存储枚举类型导致的序列化问题,读取时可再转换回枚举。

3. 替换PreferenceActivity为PreferenceFragmentCompat

AndroidX中不再推荐使用PreferenceActivity,改用PreferenceFragmentCompat实现偏好界面:

import android.os.Bundle
import androidx.preference.CheckBoxPreference
import androidx.preference.ListPreference
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceScreen

class SettingsFragment : PreferenceFragmentCompat() {
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        val prefs = MyPreferences(requireContext())
        
        // 创建根PreferenceScreen
        val screen: PreferenceScreen = preferenceManager.createPreferenceScreen(requireContext())
        
        // 添加坐标系统列表偏好
        screen.addPreference(ListPreference(requireContext()).apply {
            key = prefs.coordSys.key
            setDefaultValue(prefs.coordSys.default)
            entries = arrayOf("Lat/Long", "UTM")
            entryValues = CoordRep.values().map { it.name }.toTypedArray()
            title = "Coordinate Representation"
            summary = "Represent Coordinates as: %s"
            setSummaryProvider { preference ->
                val value = (preference as ListPreference).value
                val index = entryValues.indexOf(value)
                entries.getOrNull(index) ?: value
            }
        })
        
        // 添加视频平滑复选框偏好
        screen.addPreference(CheckBoxPreference(requireContext()).apply {
            key = prefs.showSmoothVideo.key
            setDefaultValue(prefs.showSmoothVideo.default)
            title = "Smooth Video"
            summary = "Enable smooth video"
        })
        
        // 设置根界面
        preferenceScreen = screen
    }
}

4. 修改SettingsActivity

将原SettingsActivity改为承载Fragment的普通AppCompatActivity:

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity

class SettingsActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 加载SettingsFragment
        supportFragmentManager.beginTransaction()
            .replace(android.R.id.content, SettingsFragment())
            .commit()
    }
}

关键说明

  • 避免直接实例化PreferenceManager:通过PreferenceFragmentCompat的preferenceManager属性创建界面,解决你遇到的“只能从同一库组前缀内调用”错误。
  • 保持无XML的简洁实现:完全通过代码构建偏好界面,和原逻辑一致,无需新增XML文件。
  • 类型安全优化:在PreferenceItem中针对不同类型做了针对性读取,避免泛型转换的潜在风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 08:40:38