2012-03-26 15 views
23

Ich habe eine Text-zu-Sprache-Anwendung, wo der Benutzer eine Sprache auswählen und auch eine männliche oder weibliche Stimme auswählen kann. Das Problem ist, dass für jede Sprache unterschiedliche Strings verwendet werden, um die männliche und weibliche Stimme zu benennen, aber in meiner Präferenz habe ich nur zwei Optionen (männlich und weiblich).Verwenden von Listenpräferenz 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> 

Ich versuche einen Weg zu finden, nur die relevanten männlichen und weiblichen voiceAlias ​​abhängig von der gewählten Sprache zu referenzieren. Ist es möglich, dies hier zu tun, oder muss ich einen Code schreiben, der die Werte des voiceAlias-Arrays abhängig von der gewählten Sprache ändert?

Vielen Dank im Voraus

Antwort

46

Ok, können Sie dies mit zwei ListPreference s und einem OnPreferenceChangeListener für jeden erreichen. Zunächst wird die 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"/> 

Lassen Sie uns einen neuen Eintrag in res/Werte/array.xml machen:

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

Und jetzt in der Erweiterung von PreferenceActivity, werden wir die String-Werte zu ergreifen, die behalte in deinem SharedPreferences und von ihnen einen völlig neuen Eintrag im SharedPreferences, der seinen Wert von "VoiceAlias" erhält.

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

Danke, ich mag den Ansatz. Was aber macht diese Codezeile? voiceAlias ​​[(2 * a) + genderData] – Amanni

+0

Der Wert von a ist in der for-Schleife definiert und stellt den Index von languageData innerhalb von languageAlias ​​dar. Die Schleife durchläuft languageAlias, bis sie den Wert von languageData findet. Der Wert von a wird mit zwei multipliziert, weil die Stimmen paarweise in voiceAlias ​​existieren. GenderData wird hinzugefügt. Wenn der Benutzer männlich gewählt hat, wird 0 hinzugefügt und die erste Option des Sprachpaars wird genommen. Wenn weiblich, wird 1 hinzugefügt. – gobernador

+1

nach einem Blick auf die Dokumente, es sieht aus wie 'ListPreference' will eine Zeichenfolge beibehalten. Wenn dies der Fall ist, wickle einfach die Deklaration von 'genderData' mit' Integer.parseInt (shareprefs.getString ...) 'um. – gobernador

7

String-Arrays können String-Ressourcen verwenden. Dies ist die einfachste (und wahrscheinlich einfachste) Möglichkeit, Benutzerwerte zu übersetzen.

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

Siehe Working with Strings and String Arrays

-1

Sorry, ich bin noch auf eine Antwort auf einen Kommentar nicht in der Lage, so öffne ich ein neues.

Stattdessen Ihren eigenen Algorithmus, um zu schreiben, den Index eines bestimmten Element in einer String Array finden nur auf dem Standard-API verlassen (es ist in der Regel schneller, besser Design und nur kürzer):

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

Es ist das gleiche wie:

int a = 0 

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

Funktioniert eine binäre Suche an unsortierten Daten? – gobernador

+2

der folgende ist keine binäre Suche. und @ Gobernador, nein wird es nicht. – Linxy

Verwandte Themen