Использование списка предпочтений в Android - PullRequest
29 голосов
/ 27 марта 2012

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

<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 ​​в зависимости от выбранного языка?

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

Ответы [ 3 ]

58 голосов
/ 27 марта 2012

Хорошо, вы можете сделать это с двумя ListPreference с и 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();
    }
});
8 голосов
/ 22 сентября 2014

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

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

См. Работа со строками и массивами строк

0 голосов
/ 31 мая 2015

Извините, я пока не могу комментировать ответ, поэтому открываю новый.

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

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

Это так же, как:

int a = 0

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