在Android中使用列表首选项

我有一个文本到语音应用程序,用户可以select一种语言,也可以select男性或女性的声音。 问题在于,每种语言都有不同的string,用来称呼男性和女性的声音,但在我的意愿中,我只有两种select(男性和女性)。

<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> 

我试图find一种方法,只根据select的语言引用相关的男性和女性voiceAlias。 是否有可能在这里做,或者我必须编写一些代码,根据所选语言改变voiceAlias数组的值?

提前致谢

Solutions Collecting From Web of "在Android中使用列表首选项"

好的,你可以用两个ListPreference和一个OnPreferenceChangeListener来完成这个。 首先是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"/> 

让我们在res / values / array.xml中创build一个新条目:

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

现在,在PreferenceActivity的扩展中,我们将采用持续存在于您的SharedPreferences的string值,并从SharedPreferences创build一个全新的条目,从“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数组可以使用string资源 这是翻译用户值最简单(也可能是最简单的)的方法。

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

请参阅使用string和string数组

对不起,我还没有评论答案,所以我打开了一个新的。

而不是编写自己的algorithm,以find一个String数组中的特定项目的索引只是依靠标准的API(它通常更快,更好的devise,只是更短):

 final int a = Arrays.binarySearch(languageAlias, languageData); 

这是一样的:

 int a = 0 for (a ; a < languageAlias.length ; a++) { if (languageAlias[a].equals(languageData) { break; } }