是否可以在Android中使用资源ID而不是其xml首选项的值?

时间:2015-02-19 10:01:37

标签: java android xml android-resources

目标

在我的preferences.xml中,我想存储某些字符串元素的ID(例如),例如...

<string-array name="preference_values">
    <item>@string/nav_start</item>
    <item>@string/nav_overview</item>
    <item>@string/nav_someelse</item>
</string-array>

...同时在xml/pref_general.xml ...

<ListPreference
    android:key="@string/preference_key"
    android:entryValues="@array/preference_values"
    ... />

...不同的字符串将被本地化:

<string name="nav_start">Startbildschirm</string>
<string name="nav_overview">Übersicht</string>
<string name="nav_someelse">Sonstige</string>

由于我不想存储本地化的字符串(正如那些xml定义现在所做的那样),而是它们的整数键,我真的想知道是否有办法这样做。

这会使语言更改后的首选项仍然可用。

更多背景

我真的希望能够访问/比较代码中的资源,这些资源不是拼写错误或名称更改(或者至少IDE检查/处理这些资源),例如:

switch( getMyPreferenceAsInt(R.string.preferenece_key) ) {

    case R.string.nav_start:    doSome();     break;
    case R.string.nav_someelse: doSomeElse(); break;
    ...
}

我为NavigationDrawer使用类似的东西,并发现它非常适合使用。这也是字符串值实际来自的地方(它就像一个&#34;默认的起始页面&#34;偏好)。

<string-array name="navigation_keys">
    <item>@string/nav_start</item>
    <item>@string/nav_overview</item>
    <item>@string/nav_someelse</item>
    ...
</string-array>

但至少在这里我可以使用obtainTypedArray(...)获取密钥:

void onCreate(Bundle savedInstanceState) {
    ...
    mNavKeys = getResources().obtainTypedArray(R.array.navigation_keys);
}

void onNavigationDrawerItemSelected(int position) {

    Fragment fragment;
    int selectedResource = mNavKeys.getResourceId(position, R.string.nav_default);

    if (selectedResource == R.string.nav_start) {
        fragment = FancyStartFragment.newinstance();
    }
    else {
        fragment = ...;
    }

    // Fancy methods to do a fragment transaction
    ...
}

0 个答案:

没有答案