首页 > 解决方案 > 如何在程序中启用/禁用或显示/隐藏 SharedPreferences

问题描述

在 Android 程序中启用/禁用和显示/隐藏首选项似乎应该非常简单。但是除了直接在 XML 文件本身中之外,我无法让它工作。我只能找到不推荐使用的首选项的教程和示例。这是一个示例,我正在尝试隐藏和禁用以下两个首选项。

root_preferences.xml

<androidx.preference.PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">

    <Preference
        android:key="hidePref"
        app:title="Hide/Show"
        app:summary="Change this preference's visibility"/>

    <Preference
        android:key="disablePref"
        app:title="Enable/Disable"
        app:summary="Enable or Disable this preference"/>

</androidx.preference.PreferenceScreen>
MainActivity.kt

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    val sharedPreferences = Preferencemanager.getDefaultSharedPreferences(this)

    //No idea how to do the following but here are guess that obviously do not work
    sharedPreferences.edit().isVisible("hidePref", View.GONE).apply()
    sharedPreferences.edit().isEnabled("disabledPref", false).apply()
    ...
}

标签: androidkotlinsharedpreferencesandroid-preferences

解决方案


SharedPreferences并且Preference是两个非常不同的类。ASharedPreferences是一个单例对象,可让您与保存首选项数据映射的属性文件进行交互。APreference是一个允许用户直接修改的视图小部件SharedPreferences

您正在描述您想要做的是修改视图小部件Preference的可见性或启用状态。这根本不会涉及SharedPreferences

PreferenceFragmentCompat正如文档所解释的那样,您大概在屏幕上显示了您的偏好视图。要修改特定Preference视图,请findPreference()在片段中使用。您可以指定比Preference必要时更具体的类型(只要它与您正在查找的 XML 中的实际首选项的类型相匹配)。

返回类型是可空的,因为如果找不到它,它会返回 null。您使用其键查找首选项。因此,要执行您发布的代码似乎打算执行的操作,您可以输入:

class MySettingsFragment: PreferenceFragmentCompat() {

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.root_preferences, null)

        findPreference<Preference>("hidepref")?.isVisible = false
        findPreference<Preference>("disabledPref")?.isEnabled = false
    }

}

我个人选择将我所有的偏好键放在一个字符串资源文件中(并tools:ignore="MissingTranslation"在该文件中使用以防止 linter 抱怨)。这样,键的文字字符串只在一个地方输入,减少了错误。我编写了辅助函数来获取这些首选项值SharedPreferences或使用资源 ID 查找Preference视图。


推荐阅读