web-dev-qa-db-fra.com

Utilisation des préférences de liste dans Android

J'ai une application de synthèse vocale où l'utilisateur peut sélectionner une langue et également sélectionner une voix masculine ou féminine. Le problème est que, pour chaque langue, il existe différentes chaînes appelées voix masculine et féminine, mais dans ma préférence, je n'ai que deux options (homme et femme).

<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>

J'essaie de trouver un moyen de référencer uniquement les alias vocaux masculins et féminins pertinents en fonction de la langue sélectionnée. Est-il possible de le faire ici ou dois-je écrire du code qui modifie les valeurs du tableau voiceAlias ​​en fonction de la langue sélectionnée?

Merci d'avance

29
Amanni

Ok, vous pouvez accomplir cela avec deux ListPreference et un OnPreferenceChangeListener pour chacun. D'abord le 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"/>

Faisons une nouvelle entrée dans res/values ​​/ array.xml:

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

Et maintenant, dans votre extension de PreferenceActivity, nous allons prendre les valeurs de chaîne qui persistent dans votre SharedPreferences et en créer une toute nouvelle entrée dans le SharedPreferences qui obtient sa valeur de "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();
    }
});
58
gobernador

Les tableaux de chaînes peuvent utiliser des ressources de chaîne. Il s'agit de la manière la plus simple (et probablement la plus simple) de traduire les valeurs utilisateur.

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

Voir Travailler avec des chaînes et des tableaux de chaînes

8
Shoham