如何将现有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
相关产品推荐
相关产品推荐

