在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
是两个非常不同的类。SharedPreferences
是一个单例对象,它允许您与保存首选项数据映射的属性文件进行交互。Preference
是允许用户直接修改SharedPreferences
的视图小部件。
您要描述的是修改视图小部件Preference
s的可见性或启用状态。这根本不涉及SharedPreferences
。
假设您在PreferenceFragmentCompat
中的屏幕上有自己的偏好视图,正如文档所解释的那样。要修改特定的Preference
视图,请在片段中使用findPreference()
。如果需要,您可以指定一个比Preference
更具体的类型(只要它与您正在查找的XML中实际首选项的类型匹配(。
返回类型是可以为null的,因为如果找不到它,它会返回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
视图。