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 strings used to called the male and female voice but in my preference I only have two options (male and female).
<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>
I'm trying to find a way to only reference the relevant male and female voiceAlias depending on the language selected. Is it possible to do this here or do I have to write some code which changes the values of the voiceAlias array depending on the language selected?
Thanks in Advance
It's still possible to customise the appearance of a Preference item though. In your XML you have to declare the root element as android:id="@android:id/widget_frame , and then declare TextView as android:title and android:summary . You can then declare other elements you want to appear in the layout.
Use PreferenceFragmentCompat to programatically handle preferences. To load the settings into the fragment, load the preferences in the onCreatePreferences() method. To get an instance of a preference, search for a preference using its key through the PreferenceManager within onCreateView() .
androidx.preference.PreferenceScreen. A top-level container that represents a settings screen. This is the root component of your Preference hierarchy. A PreferenceFragmentCompat points to an instance of this class to show the preferences. To instantiate this class, use PreferenceManager.
Ok, you can accomplish this with two ListPreference
s 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(); } });
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With