android - 如何在程序中启用/禁用或显示/隐藏 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()
...
}
解决方案
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
视图。
推荐阅读
- excel - 大型数组用于快速数据检索是否有缺点?
- c# - 如何防止 JsonWriter 在序列化多维数组时添加太多换行符?
- ios - Xcode中两个目标中的swift包导致重复符号
- javascript - 在javascript中设置最小日期选择器“form”和“to”
- r - 创建多个小提琴图
- r - 基于预定义形状或变量的聚类
- java - 嗨,请因为输出错误apache-poi excel java
- c# - 如何销毁实例化对象
- python - 如何在python中将数据属性设为私有
- mongodb - 在无序批量插入的情况下 InsertManyResult.inserted_ids 的顺序