从preferences.xml获取Android密钥

7

我有一个PreferencesActivity,显示了一个带有复选框的preferences.xml

preferences.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="Keywords">
    <CheckBoxPreference android:key="Essen" 
                        android:title="Essen" 
                        android:selectable="true" 
                        android:enabled="true"
                        android:persistent="false">
    </CheckBoxPreference>
    <CheckBoxPreference android:key="Kleidung" 
                        android:title="Kleidung" 
                        android:selectable="true" 
                        android:enabled="true"
                        android:persistent="false">
    </CheckBoxPreference>
</PreferenceCategory>
</PreferenceScreen>

PreferencesActivity:

public class PreferencesViewController extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
    }
}

现在在另一个ListActivity中,我想展示所有选中复选框的键/标题。我尝试使用以下方式访问首选项:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

或者

SharedPreferences prefs = getSharedPreferences("mypackage_preferences", 0);

但是两者都不起作用。

当我调用 prefs.getAll().size() 时,结果为0。

我可以使用 getPreferenceScreen().getPreference(i).… 访问键/标题,但它只能从 PreferenceActivity 中访问,而无法从其他 Activity 中访问。

有人有解决此问题的方案吗?

4个回答

3
你不需要使用PreferenceActivity来完成这个任务。
要访问在你的PreferenceActivity中使用的偏好设置,你应该使用:
SharedPreferences prefs = 
    PreferenceManager.getDefaultSharedPreferences(getBaseContext());

如果您的数据列表来自服务器,则可以使用ListActivity/ExpandableListActivity/任何自定义活动来可视化它,但这样需要编写更改首选项的处理程序。

通常的做法是:

private void saveStringPreference(final String key, final String value)
{
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString(key, value);
    editor.commit();
}

如果需要,您应该创建类似的包装器来处理 int、boolean 等值。


1
谢谢。我已经搜索了大约一个小时才找到这个答案。 我有一个preferences.xml和preferences.java,但我想使用另一个屏幕来设置值。再次感谢。 - EGHDK
Why getBaseContext()? - Mr_and_Mrs_D
1
我想我们永远不会知道。 - Denny

2

I use

SharedPreferences prefs = 
    PreferenceManager.getDefaultSharedPreferences(getBaseContext());

然后,我可以通过 prefs.get...() 访问首选项,例如 prefs.getString(key)

编辑: 刚刚检查了一下 - prefs.getAll() 按预期工作,并返回包含所有首选项的 Map


问题是我想从互联网/服务器更新这些首选项,但我不知道每个复选框的键。因此,应该在一个 Activity/View 中显示好这些首选项,以便用户可以勾选/取消勾选它们。我必须读取被选中的首选项,并且这些首选项应该由服务器更新... 可能 PreferenceActivity 不是正确的解决方案? :-/ - liquid

1
我也遇到了这个问题。不幸的是,这是一个经典的RTFM错误。你应该在MainActivity的onCreate()方法中添加以下代码行:
PreferenceManager.setDefaultValues(this, R.xml.preferences, false);

这个信息可以在http://developer.android.com/guide/topics/ui/settings.html的“设置默认值”段落中找到。

0

你应该使用

SharedPreferences prefs = referenceManager.getDefaultSharedPreferences(this);

如果您从未通过PreferencesActivity设置过偏好设置,则可能为空。此外,我认为您的ListActivity必须与PreferencesActivity位于同一个包中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接