在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;
    }
}