2012-03-26 12 views
23

Ho un'applicazione di sintesi vocale in cui l'utente può selezionare una lingua e selezionare anche una voce maschile o femminile. Il problema è che per ogni lingua ci sono diverse stringhe usate per chiamare la voce maschile e femminile, ma nella mia preferenza ho solo due opzioni (maschio e femmina).Utilizzo della preferenza elenco in 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> 

Sto cercando di trovare un modo per fare riferimento solo alla voce maschile e femminile pertinentiAlias ​​in base alla lingua selezionata. È possibile farlo qui o devo scrivere un codice che modifichi i valori della matrice voiceAlias ​​in base alla lingua selezionata?

Grazie in anticipo

risposta

46

Ok, è possibile eseguire questa con due ListPreference s ed un OnPreferenceChangeListener per ciascuno. In primo luogo l'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"/> 

Facciamo una nuova voce nella res/Valori/array.xml:

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

E ora nella vostra estensione di PreferenceActivity, stiamo andando a prendere i valori di stringa che persistere nel tuo SharedPreferences e da loro creare una voce completamente nuova nel SharedPreferences che ottiene il suo valore da "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(); 
    } 
}); 
+0

Grazie, mi piace l'approccio. Tuttavia, cosa fa questa linea di codice? voiceAlias ​​[(2 * a) + genderData] – Amanni

+0

Il valore di a è definito nel ciclo for e rappresenta l'indice del linguaggio Dati all'interno del linguaggioAlias. Il ciclo scorre attraverso languageAlias ​​fino a quando non trova il valore di languageData. Il valore di a viene moltiplicato per due perché le voci esistono in coppia all'interno di voiceAlias. genderData è aggiunto a questo. Se l'utente seleziona il maschio, viene aggiunto 0 e viene presa la prima opzione della coppia di lingue. Se femmina, viene aggiunto 1. – gobernador

+1

dopo aver osservato un po 'più vicino i documenti, sembra che 'ListPreference' vuole mantenere una stringa. Se trovi che questo è il caso, basta avvolgere la dichiarazione di 'genderData' con' Integer.parseInt (shareprefs.getString ...) ' – gobernador

7

Gli array di stringhe possono utilizzare le risorse di stringa. Questo è il modo più semplice (e probabilmente il più semplice) per tradurre i valori dell'utente.

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

Vedi Working with Strings and String Arrays

-1

dispiace, io non sono in grado di commentare ancora una risposta, così ho aprirne uno nuovo.

Invece di scrivere il proprio algoritmo per trovare l'indice di un particolare elemento in un array String fare affidamento solo sul API standard (di solito è più veloce, una migliore progettazione e appena più corta):

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

E ' lo stesso di:

int a = 0 

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

Una ricerca binaria funzionerà su dati non ordinati? – gobernador

+2

la seguente non è una ricerca binaria. e @gobernador, no non lo farà. – Linxy

Problemi correlati