Где хранить ключи настроек Android? - PullRequest
55 голосов
/ 18 мая 2010

Когда я создаю действие предпочтений, я определяю все предпочтения в файле XML. У каждого предпочтения есть ключ, определенный в этом xml. Но когда я получаю доступ к предпочтениям, я пишу:

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

Есть ли способ избежать ссылки на "foo_key_defined_in_xml" жестко? Может быть, есть возможность ссылаться на него в стиле R (не ссылаться на строку)?

Ответы [ 6 ]

71 голосов
/ 19 мая 2010

Я обнаружил, что можно хранить ключи в strings.xml и ссылаться на них из preferences.xml , как и все другие значения android:key="@string/preference_enable".

В коде вы можете обратиться к клавише, набрав getString(R.string.preference_enable)

Вы можете пометить строку как не подлежащую переводу, используя тег <xliff:g>. См. Контрольный список локализации

<string name="preference_enable"><xliff:g id="preference_key">enable</xliff:g></string>
12 голосов
/ 27 марта 2016

Вы можете использовать файлы "keys.xml" в "res / values", но вы должны поместить что-то вроде этого, чтобы у вас не было проблем при использовании нескольких языков:

    <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));
1 голос
/ 09 февраля 2011

Как насчет использования вспомогательного класса, чтобы скрыть 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);
    }
}
1 голос
/ 18 мая 2010

Попробуйте getString(R.string.key_defined_in_xml).

1 голос
/ 18 мая 2010

Насколько я знаю, нет лучшего способа ссылки на предпочтительные ключи (кроме, возможно, использования статической конечной строки для хранения строки в классе).

Пример , приведенный в документации SDK, делает то же, что и пример, приведенный в вашем примере,

0 голосов
/ 25 сентября 2018

В 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"/>

См .: Настройка непереводимых строк

...