Android从preferencess.xml获取密钥

问题描述:

我有一个PreferencesActivity,显示带有复选框的preferences.xmlAndroid从preferencess.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).…访问键/名称,但它不会从一个不同的Activity工作,只能从PreferenceActivity

有没有人有解决方案如何获得这项工作?

我使用

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

然后我可以通过prefs.get...(),例如访问首prefs.getString(key)。 你试过这个吗?

编辑:刚才检查 - prefs.getAll()按预期工作,并返回所有喜好Map

+0

已经尝试过这一点。 – liquid 2011-03-10 09:18:27

+0

问题是我想从Internet/Server更新这些首选项。所以我不知道每个复选框的关键。因此,首选项应显示在活动/视图中,用户可以选中/取消选中它们。我必须阅读选中的偏好设置,偏好应该由服务器更新......也许PreferenceActivity不是正确的解决方案?! : -/ – liquid 2011-03-10 09:27:39

您应该使用

SharedPreferences prefs = referenceManager.getDefaultSharedPreferences(this); 

的偏好可能是空的,如果你从来没有通过PreferencesActivity设置。另外我认为你的ListActivity必须与PreferencesActivity在同一个包中。

您不需要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(); 
} 

如果你需要,你应该建立类似的包装处理与诠释,布尔值等。

+1

谢谢。我一直在寻找这个答案大约一个小时。 我有一个preferences.xml和preferences.java,但我想用另一个屏幕来设置值。再次感谢。 – EGHDK 2012-02-28 10:39:50

+0

为什么'getBaseContext()'? – 2013-12-24 22:26:11

+0

我想我们永远不会知道 – Denny 2017-12-31 13:50:05

我也有这个问题。可悲的是,这是一款经典的RTFM。你应该把线下在MainActivity的onCreate()方法:

PreferenceManager.setDefaultValues(this, R.xml.preferences, false); 

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