在Android中使用列表首选项
我有一个文本到语音的应用程序,用户可以选择语言,也可以选择男性或女性的声音。问题是,对于每种语言,都有不同的字符串用于调用男性和女性语音,但在我的偏好中,我只有两种选择(男性和女性)在Android中使用列表首选项,android,preferences,text-to-speech,listpreference,Android,Preferences,Text To Speech,Listpreference,我有一个文本到语音的应用程序,用户可以选择语言,也可以选择男性或女性的声音。问题是,对于每种语言,都有不同的字符串用于调用男性和女性语音,但在我的偏好中,我只有两种选择(男性和女性) 英语(美国) 英语(英国) 法语(法国) 西班牙语(西班牙) 意大利人 “恩我们” “欧洲国家标准” “fr fr” “es es” “是它” 男性 女性 “使用英语男性” “使用英语女性” “ukenglishmale” “英国英语女性” “欧洲法语” “欧洲法国女性” “欧洲男性” “欧洲女性” “欧洲男性”
英语(美国)
英语(英国)
法语(法国)
西班牙语(西班牙)
意大利人
“恩我们”
“欧洲国家标准”
“fr fr”
“es es”
“是它”
男性
女性
“使用英语男性”
“使用英语女性”
“ukenglishmale”
“英国英语女性”
“欧洲法语”
“欧洲法国女性”
“欧洲男性”
“欧洲女性”
“欧洲男性”
“欧洲女性”
我试图找到一种方法,根据所选语言,只引用相关的男性和女性语音别名。是否可以在此处执行此操作,或者我必须编写一些代码,根据所选语言更改voiceAlias数组的值
提前感谢好的,您可以使用两个
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"/>
字符串数组可以使用字符串资源。这是转换用户值的最简单(可能也是最简单)的方法
<string-array name="user_values">
<item>@string/value_1</item>
<item>@string/value_2</item>
</string-array>
@字符串/值\u 1
@字符串/值2
请参见对不起,我还无法对答案发表评论,因此我打开了一个新答案
与其编写自己的算法来查找字符串中特定项的索引
数组,不如依赖标准API(它通常更快、更好、更短):
这与:
int a = 0
for (a ; a < languageAlias.length ; a++) {
if (languageAlias[a].equals(languageData) {
break;
}
}
inta=0
对于(a;a
谢谢,我喜欢这种方法。但是这行代码做什么呢?voiceAlias[(2*a)+genderData]a的值在for循环中定义,它表示languageAlias中languageData的索引。循环在languageAlias中循环,直到找到languageData的值。a的值乘以2,因为语音在voiceAlias中成对存在。genderData被添加到该循环中。如果用户选择了男性,则添加0,并添加t选择语言对的第一个选项。如果是女性,则添加1。仔细查看文档后,看起来ListPreference
想要保留一个字符串。如果发现是这种情况,只需将genderData
的声明用Integer.parseInt(shareprefs.getString…
什么是getPreference()?请注意,SharedReferences
需要在编辑时调用edit()
和commit()
或apply()
。以下不是二进制搜索。而@gobernador则不会。
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-array name="user_values">
<item>@string/value_1</item>
<item>@string/value_2</item>
</string-array>
final int a = Arrays.binarySearch(languageAlias, languageData);
int a = 0
for (a ; a < languageAlias.length ; a++) {
if (languageAlias[a].equals(languageData) {
break;
}
}