enable/disable 或 show/hide SharedPreferences 如何在程序中使用

How do enable/disable or show/hide SharedPreferences in programs

在 Android 程序中 enable/disable 和 show/hide 首选项似乎应该非常简单。但是除了直接在 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()
    ...
}

SharedPreferencesPreference是两个截然不同的类。 SharedPreferences 是一个单例对象,可让您与包含首选项数据映射的属性文件进行交互。 Preference 是一个视图小部件,允许用户直接修改 SharedPreferences.

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

据推测,您在 PreferenceFragmentCompatdocumentation explains 屏幕上的偏好视图。要修改特定的 Preference 视图,请在片段中使用 findPreference()。如有必要,您可以指定比 Preference 更具体的类型(只要它与您正在查找的 XML 中的实际偏好类型匹配)。

return 类型可以为 null,因为如果找不到它,它 return 就是 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 视图。