【问题标题】:How do enable/disable or show/hide SharedPreferences in programs如何在程序中启用/禁用或显示/隐藏 SharedPreferences
【发布时间】:2020-11-24 01:59:35
【问题描述】:

在 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()
    ...
}

【问题讨论】:

    标签: android kotlin sharedpreferences android-preferences


    【解决方案1】:

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

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

    大概您在屏幕上以PreferenceFragmentCompat 作为documentation explains 有您的偏好视图。要修改特定的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 视图。

    【讨论】:

    • 感谢@Tenfour04 的解释。后续问题,有没有办法查看用户在启动按钮单击以加载首选项时处于哪个活动?例如,我有 Activity A 和 Activity B,流程从 A 流向 B。我有一个 Preference,我只希望用户在 Activity B 时可用,但如果他们在 Activity A 上输入 Preferences,则禁用它。我可以的唯一解决方案想到的是为每个 Activity 设置不同的首选项 xml 文件集,这可能会导致试图在它们之间复制 pref 值。
    • 您的设置片段可以在附加后检查它附加的活动并相应地隐藏特定的首选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    相关资源
    最近更新 更多