studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android preferences text-to-speech listpreference

programacion - Usando la preferencia de lista en Android



manual de programacion android pdf (3)

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

En lugar de escribir su propio algoritmo para encontrar el índice de un elemento en particular en una matriz de String solo confíe en la API estándar (generalmente es más rápido, mejor diseño y 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; } }

Tengo una aplicación de texto a voz donde el usuario puede seleccionar un idioma y también una voz masculina o femenina. El problema es que para cada idioma hay diferentes cadenas utilizadas para llamar la voz masculina y femenina, pero en mi preferencia solo tengo dos opciones (masculino y femenino).

<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 solo a las voces de Alias ​​masculinas y femeninas relevantes en función 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


Los arrays de cadenas pueden usar recursos de cadenas. Esta es la forma más fácil (y probablemente más sencilla) de traducir los valores de usuario.

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

Ver Trabajar con cadenas y matrices de cadenas.


Ok, puedes lograr esto con dos ListPreference sy 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 su extensión de PreferenceActivity , vamos a tomar los valores de cadena que persisten en sus SharedPreferences y a partir de ellos crearemos 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(); } });