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>
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();
}
});