2012-03-26 12 views
23

Tengo una aplicación de texto a voz donde el usuario puede seleccionar un idioma y también seleccionar una voz masculina o femenina. El problema es que para cada idioma hay diferentes cadenas que se utilizan para llamar a la voz masculina y femenina, pero en mi preferencia solo tengo dos opciones (masculina y femenina).Uso de preferencia de lista en 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> 

Estoy tratando de encontrar la manera de solo hacer referencia a las voces de voz masculinas y femeninas correspondientes según el idioma seleccionado. ¿Es posible hacer esto aquí o tengo que escribir algún código que cambie los valores de la matriz de VoiceAlias ​​dependiendo del idioma seleccionado?

Gracias de antemano

Respuesta

46

Ok, se puede lograr esto con dos ListPreference s y un OnPreferenceChangeListener para cada uno. En primer lugar el 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"/> 

Vamos a hacer una nueva entrada en res/valores/array.xml:

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

Y ahora en su extensión de PreferenceActivity, vamos a tomar los valores de cadena, que persistir en su SharedPreferences y crear una entrada completamente nueva en el SharedPreferences que obtiene su valor 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(); 
    } 
}); 
+0

Gracias, me gusta el enfoque. Sin embargo, ¿qué hace esta línea de código? voiceAlias ​​[(2 * a) + genderData] – Amanni

+0

El valor de a se define en el ciclo for y representa el índice de languageData dentro de languageAlias. El ciclo realiza un ciclo a través de LanguageAlias ​​hasta que encuentra el valor de languageData. El valor de a se multiplica por dos porque las voces existen en pares dentro de voiceAlias. GenderData se agrega a esto. Si el usuario seleccionó hombre, se agrega 0 y se toma la primera opción del par de idiomas. Si es mujer, se agrega 1. – gobernador

+1

después de mirar un poco más de cerca a los documentos, parece que 'ListPreference' desea mantener una Cadena. Si encuentra que este es el caso, solo ajuste la declaración de 'genderData' con' Integer.parseInt (shareprefs.getString ...) ' – gobernador

7

Las matrices de cadenas pueden usar recursos de cadena. Esta es la forma más fácil (y probablemente la más simple) de traducir los valores del usuario.

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

Ver Working with Strings and String Arrays

-1

Lo sentimos, no estoy en condiciones de comentar una respuesta todavía, así que abrir una nueva.

En lugar de escribir su propio algoritmo para encontrar el índice de un elemento determinado en una matriz String sólo se basan en la norma API (por lo general es más rápido, mejor diseño y simplemente más corto):

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

¡Es lo mismo que:

int a = 0 

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

¿Funcionará una búsqueda binaria en datos sin clasificar? – gobernador

+2

lo siguiente no es búsqueda binaria. y @gobernador, no, no lo hará. – Linxy

Cuestiones relacionadas