在哪里存储Android偏好键?

时间:2010-05-18 12:18:49

标签: java android android-preferences

当我创建首选项活动时,我在xml文件中定义所有首选项。每个首选项都有一个在此xml中定义的键。但当我访问偏好时,我写道:

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

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

7 个答案:

答案 0 :(得分:71)

我发现可以将密钥存储在 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 :(得分:11)

你可以在“res / values”中使用“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 :(得分:1)

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

SDK文档中提供的example与您在示例中提供的内容相同,

答案 3 :(得分:1)

尝试getString(R.string.key_defined_in_xml)

答案 4 :(得分: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);
    }
}

答案 5 :(得分:0)

在strings.xml中,将密钥标记为不可翻译:

<string name="screw_spacing_key" translatable="false">Screw spacing</string>
<string name="screw_spacing_title">Screw spacing</string>
<string name="screw_spacing_summary">Set screw spacing</string>

用法:

<EditTextPreference
    android:key="@string/screw_spacing_key"
    android:title="@string/screw_spacing_title"
    android:summary="@string/screw_spacing_summary"/>

请参阅:Configure untranslatable rows

答案 6 :(得分:0)

不确定该帖子是否需要其他答案,请问我最终是这样的吗:

-扩展所需的所有首选项并添加此代码

   final static private int[] ATTR_INDEX = {android.R.attr.id};
    private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){
        if(attrs == null) return;
        AttributeReader attributes = new AttributeReader().setAttrsIndex(ATTR_INDEX).parse(attrs);
        int id = attributes.asResourceID(0);
        setKey(AppContext.getIdentifierName(id));
    }
  • 在xml中,不要使用key属性,而是android:id =“ @ + id /...
  • 最后取回值

    SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(getContext()); 字符串preference_1 = SP.getString(AppContext.getIdentifierName(R.id.pref_key_1),空);

这样,您无需创建需要维护的字符串文件,只需动态创建任何ID。但是您需要熟悉扩展视图并阅读attr来查找所需的内容(此处为id属性)