I have a text to speech application where the user can select a language and also select a male or female voice. The problem is that for each language there are different st
Ok, you can accomplish this with two ListPreferences and an OnPreferenceChangeListener for each. First the 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"/>
Let's make a new entry in res/values/array.xml:
<string-array name="VoiceData">
<item>0</item>
<item>1</item>
</string-array>
And now in your extention of PreferenceActivity, we're going to take the string values which persist in your SharedPreferences and from them create a completely new entry in the SharedPreferences which gets its value from "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();
}
});
Sorry, I'm not able to comment on an answer yet, so I open a new one.
Instead of writing your own algorithm in order to find the index of a particular item in a String array just rely on the standard API (it's usually faster, better design and just shorter):
final int a = Arrays.binarySearch(languageAlias, languageData);
It's the same as :
int a = 0
for (a ; a < languageAlias.length ; a++) {
if (languageAlias[a].equals(languageData) {
break;
}
}
String arrays can use string resources. This is the easiest (and probably simplest) way to translate user values.
<string-array name="user_values">
<item>@string/value_1</item>
<item>@string/value_2</item>
</string-array>
See Working with Strings and String Arrays