当我创建首选项活动时,我在xml文件中定义所有首选项。每个首选项都有一个在此xml中定义的键。但当我访问偏好时,我写道:
SharedPreferences appPreferences = PreferenceManager.getDefaultSharedPreferences(this);
boolean foo_value = appPreferences.getBoolean("foo_key_defined_in_xml", false);
有没有办法避免以硬编码的方式引用“foo_key_defined_in_xml”? 也许有可能以R风格的方式引用它(不是指字符串)?
答案 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"/>
答案 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));
}
最后取回值
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(getContext()); 字符串preference_1 = SP.getString(AppContext.getIdentifierName(R.id.pref_key_1),空);
这样,您无需创建需要维护的字符串文件,只需动态创建任何ID。但是您需要熟悉扩展视图并阅读attr来查找所需的内容(此处为id属性)