- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经设置了一个带有两个 bool 首选项的 PreferenceFragment
。 Fragment
工作正常,设置会在应用程序关闭并重新打开时存储。但是,我在尝试读取这些值时遇到了问题;仅返回默认值。如果我调试到 SharedPreferences
的 getBoolean
方法,我看到本地 HashMap
的大小为 0,因此返回默认值,如下所示:
public boolean getBoolean(String key, boolean defValue) {
synchronized (this) {
awaitLoadedLocked();
Boolean v = (Boolean)mMap.get(key); // <-- mMap is of size 0: return defValue
return v != null ? v : defValue;
}
}
我觉得这很奇怪,因为偏好值显然已正确存储并加载到 PreferenceFragment
中。我错过了什么?
在Activity.onCreate()
中:
PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
res/xml/preferences.xml:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:key="mm_preferences_category_recipe_preferences"
android:title="@string/mm_preferences_category_recipe_preferences_title" >
<CheckBoxPreference
android:key="@string/mm_preferences_numbers_as_fractions_key"
android:title="@string/mm_preferences_numbers_as_fractions_title"
android:summary="@string/mm_preferences_numbers_as_fractions_summary"
android:defaultValue="true" />
<CheckBoxPreference
android:key="@string/mm_preferences_comma_as_decimal_separator_key"
android:title="@string/mm_preferences_comma_as_decimal_separator_title"
android:summary="@string/mm_preferences_comma_as_decimal_separator_summary"
android:defaultValue="true" />
</PreferenceCategory>
</PreferenceScreen>
我的PreferenceFragment
类:
public class MiasMatPreferencesFragment extends PreferenceFragment
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
现在,在应用程序的任何位置执行此操作,仅返回默认值(在两种情况下均为 true),即使 PreferenceFragment
显示值设置为 false(如果是):
boolean foo = getPreferences(Context.MODE_PRIVATE).getBoolean(getString(R.string.mm_preferences_numbers_as_fractions_key), true);
boolean bar = getPreferences(Context.MODE_PRIVATE).getBoolean(getString(R.string.mm_preferences_comma_as_decimal_separator_key), true);
最佳答案
在摆弄了几个小时之后,我弄清楚了这对我不起作用的原因。单个应用程序中有多个 SharedPreferences
,我没有意识到。这意味着 (1) Activity.getPreferences(int mode)
、(2) Context.getSharedPreferences(String name, int mode)
和 (3) PreferenceManager。 getDefaultSharedPreferences(Context context)
返回 SharedPreferences
的不同实例。
在我的例子中,解决方案是使用 PreferenceManager.getDefaultSharedPreferences(Context context)
。这是因为我使用了 custom library为了向后兼容 PreferenceFragment
。该库写入默认首选项文件。
来自文档:
PreferenceManager.getDefaultSharedPreferences(Context context)
Gets a SharedPreferences instance that points to the default file that is used by the preference framework in the given context.
因此,这是给定 Context
或 Activity
的首选项,随时使用首选项的默认文件名。这是 PreferenceManager
类的静态实例。
Context.getSharedPreferences(String name, int mode)
Retrieve and hold the contents of the preferences file 'name', returning a SharedPreferences through which you can retrieve and modify its values. Only one instance of the SharedPreferences object is returned to any callers for the same name, meaning they will see each other's edits as soon as they are made.
使用此方法,您可以使用 String
参数区分多个首选项文件。
Activity.getPreferences(int mode)
Retrieve a SharedPreferences object for accessing preferences that are private to this activity.
此方法直接调用前一个方法,如下所示:getSharedPreferences(getLocalClassName(), mode)
。因此,它根据 Activity
的名称指向一个文件。
其他相关问题(可能重复):
Difference between getDefaultSharedPreferences and getSharedPreferences
PreferenceManager.getDefaultSharedPreferences() vs getPreferences()
关于android - getPreferences 总是返回默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32012688/
我已经设置了一个带有两个 bool 首选项的 PreferenceFragment。 Fragment 工作正常,设置会在应用程序关闭并重新打开时存储。但是,我在尝试读取这些值时遇到了问题;仅返回默认
我正在尝试存储一个 bool 值,每次单击按钮时都会更改该值。我想使用共享首选项来执行此操作,但是我一直遇到此错误: Unresolved reference :getPreferences 这是我的
我无法在我的方法中访问 sharedPreferences 接口(interface)的 getPreferences 方法。我在我的方法 logintofacebook 中使用了 getprefer
**经过研究并尝试查看 stackoverflow 解决方案并尝试应用它们但全部失败后,此错误仍然存在。我尝试使用 SharedPreferences 和 getPrefernces 来保存数据。
我正在尝试使用对话框中的首选项,但遇到了一些困难。我的应用程序的其余部分只使用 getPreferences() 对话框,似乎没有任何问题。但是,Dialog 不能调用 getPreferences(
我目前正在参加 Udacity 的“开发 Android 应用程序”类(class)。在“第 3 课:新 Activity 和 Intent > 使用 SharedPreferences”部分,讲师要
PreferenceManager.getDefaultSharedPreferences(context) 和 getPreferences() 似乎检索不同的首选项。 PreferenceMana
我有一个简单的问题(可能非常愚蠢),但是我没有找到答案。 我正在尝试在我使用 libgdx 构建的游戏中保存一个简单的偏好,比如“高分”。 这是我的示例代码- Preferences prefs2;
我有一个包含 Activity 和服务的应用程序,我需要在 Activity 中保存一些值并在服务中检索。 我可以在 Activity 中使用 SharedPreferences 保存值,但是,当我尝
我有一些我想从服务访问的共享首选项(纬度、经度),这些首选项不是 Activity 的子类。 特别是,当我尝试访问 getPreferences 时,该功能在服务上不存在。我的代码贴在下面 我的目标是
我是一名优秀的程序员,十分优秀!