Использование предпочтений списка в Android

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

<string-array name="Language"> <item>English (US)</item> <item>English (UK)</item> <item>French (France)</item> <item>Spanish (Spain)</item> <item>Italian</item> </string-array> <string-array name="languageAlias"> <item>"en-US"</item> <item>"en-GB"</item> <item>"fr-FR"</item> <item>"es-ES"</item> <item>"it-IT"</item> </string-array> <string-array name="Voice"> <item>Male</item> <item>Female</item> </string-array> <string-array name="VoiceAlias"> <item>"usenglishmale"</item> <item>"usenglishfemale"</item> <item>"ukenglishmale"</item> <item>"ukenglishfemale"</item> <item>"eurfrenchmale"</item> <item>"eurfrenchfemale"</item> <item>"eurspanishmale"</item> <item>"eurspanishfemale"</item> <item>"euritalianmale"</item> <item>"euritalianfemale"</item> </string-array> 

Я пытаюсь найти способ ссылаться только на соответствующие мужские и женские голоса в зависимости от выбранного языка. Возможно ли это сделать здесь или мне нужно написать код, который изменяет значения массива voiceAlias ​​в зависимости от выбранного языка?

Заранее спасибо

Solutions Collecting From Web of "Использование предпочтений списка в Android"

Хорошо, вы можете выполнить это с помощью двух ListPreference s и OnPreferenceChangeListener для каждого. Сначала XML:

 <ListPreference android:key="language_preference" android:title="Language" android:entries="@array/Language" android:entryValues="@array/languageAlias"/> <ListPreference android:key="gender_preference" android:title="Gender" android:entries="@array/Voice" android:entryValues="@array/VoiceData"/> 

Давайте сделаем новую запись в res / values ​​/ array.xml:

 <string-array name="VoiceData"> <item>0</item> <item>1</item> </string-array> 

И теперь, в вашем расширении PreferenceActivity , мы собираемся взять строковые значения, которые сохраняются в ваших SharedPreferences и из них создают совершенно новую запись в SharedPreferences которая получает свое значение от «VoiceAlias».

 SharedPreferences shareprefs = getPreferenceManager().getSharedPreferences(); Resources resources = YourContext.getResources(); private void makeVoiceData() { String languageData = shareprefs.getString("language_preference", "en-US"); int genderData = Integer.parseInt(shareprefs.getString("gender_preference", "0")); String[] voiceAlias = resources.getStringArray(R.array.VoiceAlias); int a = 0 String[] languageAlias = resources.getStringArray(R.array.languageAlias); for (a ; a < languageAlias.length ; a++) { if (languageAlias[a].equals(languageData)) { break; } } shareprefs.putString("VoiceAlias", voiceAlias[(2 * a) + genderData]); } ListPreference language_preference = getPreference("language_preference"); ListPreference gender_preference = getPreference("gender_preference"); language_preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { public boolean onPreferenceChanged(Preference preference, Object newValue) { shareprefs.putString("language_preference", (String) newValue); makeVoiceData(); } }); gender_preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { public boolean onPreferenceChanged(Preference preference, Object newValue) { shareprefs.putString("gender_preference", (String) newValue); makeVoiceData(); } }); 

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

 <string-array name="user_values"> <item>@string/value_1</item> <item>@string/value_2</item> </string-array> 

См. Раздел Работа со строками и строковыми массивами

К сожалению, я пока не могу ответить на этот вопрос, поэтому я открываю новый.

Вместо того, чтобы писать собственный алгоритм, чтобы найти индекс определенного элемента в массиве String просто полагайтесь на стандартный API (он обычно быстрее, лучше проектируется и короче):

 final int a = Arrays.binarySearch(languageAlias, languageData); 

Это то же самое, что:

 int a = 0 for (a ; a < languageAlias.length ; a++) { if (languageAlias[a].equals(languageData) { break; } }