2010-05-18 86 views
43

当我创建首选项活动时,我在xml文件中定义所有首选项。每个首选项都有一个在此xml中定义的密钥。但是,当我进入首我写的:在哪里存储Android偏好键?

SharedPreferences appPreferences = PreferenceManager.getDefaultSharedPreferences(this); 
boolean foo_value = appPreferences.getBoolean("foo_key_defined_in_xml", false); 

有什么办法避免硬编码方式引用“foo_key_defined_in_xml”? 也许有可能以R风格的方式引用它(不参考字符串)?

回答

59

我发现,它可能将密钥存储在的strings.xml的preferences.xml指他们就像所有其他值android:key="@string/preference_enable"

在代码中,你可以参考键键入getString(R.string.preference_enable)

您可以标记该字符串不使用<xliff:g>标签进行翻译。见Localization Checklist

<string name="preference_enable"><xliff:g id="preference_key">enable</xliff:g></string> 
+1

这是最好的方法,因为它允许您在一个位置更改密钥,并且它将传播到设置页面和您在代码中引用它的任何位置。 – 2010-10-18 23:10:50

+5

我建议不要这样做,因为当你支持多种语言的XML文件时,密钥字符串可能会被无意中翻译过。 – 2012-08-05 18:43:11

+16

那么,你应该将这些键保存在只包含静态值和不翻译的不同文件中。 – Hameno 2013-01-02 02:43:12

0

据我所知,没有更好的方法来引用优选键(除了可能使用静态最终字符串来存储字符串类)。

在SDK文档中给出的example不一样的,你在你的例子已经给了什么,

+0

这就是我喜欢这样做的方式。通过这种方式,当您创建一个新的密钥时,在您创建的同一个文件中,这是一个公共静态最终字符串引用,可供任何可能需要引用该类的类使用。 – 2010-08-19 06:13:55

1

尝试getString(R.string.key_defined_in_xml)

+0

不起作用。来自'android:key'的值不存储在这个类中。 – scai 2017-06-18 14:04:10

1

怎么样使用一个辅助类隐藏的getString() - 一旦在每个活动或服务初始化助手。例如:

class Pref { 

    final String smsEnable_pref; 
    final String interval_pref; 
    final String sendTo_pref; 
    final String customTemplate_pref; 
    final String webUrl_pref; 

    Pref(Resources res) {  
     smsEnable_pref = res.getString(R.string.smsEnable_pref); 
     interval_pref = res.getString(R.string.interval_pref); 
     sendTo_pref = res.getString(R.string.sendTo_pref); 
     customTemplate_pref = res.getString(R.string.customTemplate_pref); 
     webUrl_pref = res.getString(R.string.webUrl_pref); 
    } 
} 
+0

我不确定什么ddcruver意味着什么如果你在/res/values/string.xml中定义一个资源来保存这个键名,你就不能在android:key =“key_name”中使用它.__ Pixel写道,你可以使用android:key =“@串/ preference_key”。也许我错过了一些东西。 – 2011-02-12 05:21:26

7

你可以在“资源/值”使用“keys.xml”的文件,但是应该把这样的事情,这样你应该不有问题,当您使用多种语言:

<resources 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:ignore="MissingTranslation"> 

    <string name="key1">key1</string> 
    <string name="key2">key2</string> 
... 
</resources> 

然后,你可以参考它像一个XML格式的正常的字符串:

.... 
android:key="@string/key1" 
.... 

或例如Java代码:

SwitchPreference Pref1= (SwitchPreference) getPreferenceScreen().findPreference(getString(R.string.key1)); 
+2

我喜欢它比接受的答案更好,因为它更干净(并且实际上在该答案的评论中建议)。唉,“字符串/”命名空间仍然会受到实际字符串和首选项的影响 - 必须使用前缀来很好地解决它。 – 2017-08-26 13:12:24