Uso de la preferencia de lista en Android

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 cuerdas usadas para llamar a voz masculina y femenina pero en mi preferencia solo tengo dos opciones (masculina y femenina).

<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 una manera de hacer referencia sólo a las voces masculinas y femeninas relevantes dependiendo del 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 por adelantado

3 Solutions collect form web for “Uso de la preferencia de lista en Android”

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

Hagamos una nueva entrada en res / values ​​/ array.xml:

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

Y ahora en tu extensión de PreferenceActivity , vamos a tomar los valores de cadena que persisten en tu SharedPreferences y de ellos crear una entrada completamente nueva en 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(); } }); 

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

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

Consulte Trabajo con cadenas y conjuntos de cadenas

Lo siento, todavía no puedo comentar una respuesta, así que abro una nueva.

En lugar de escribir su propio algoritmo con el fin de encontrar el índice de un elemento en particular en una matriz String sólo confiar en la API estándar (es generalmente más rápido, mejor diseño y sólo 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; } } 
  • Android llamada TTS en BroadcastReceiver
  • ¿Cómo puedo guardar la salida TTS en un archivo de audio en android?
  • Ejecución de TTS Android en un servicio
  • ¿Cómo saber cuándo se termina el TTS?
  • TTS android 4.1 jellybean
  • Transmisión de notificaciones de texto a voz durante la conducción
  • ¿Qué significan los nombres / códigos de Android Voice?
  • ¿Cómo puedo controlar cómo Android TTS reproduce audio?
  • La función de devolución de llamada de Android TTS onUtteranceCompleted no se recibe
  • Cómo deshabilitar la accesibilidad "TalkBack" en su aplicación?
  • Cómo detener android.speech.tts.TextToSpeech?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.