ユーザーが言語を選択し、男性または女性の声を選択できる音声合成アプリケーションがあります。問題は、言語ごとに男性と女性の音声を呼び出すために使用される異なる文字列がありますが、私の好みでは、2つのオプション(男性と女性)しかありません。
<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>
選択した言語に応じて、関連する男性と女性のvoiceAliasのみを参照する方法を見つけようとしています。ここでこれを行うことは可能ですか、選択した言語に応じてvoiceAlias配列の値を変更するコードを記述する必要がありますか?
前もって感謝します
OK、2つのListPreference
sとそれぞれの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に新しいエントリを作成しましょう。
<string-array name="VoiceData">
<item>0</item>
<item>1</item>
</string-array>
PreferenceActivity
の拡張で、SharedPreferences
に保持される文字列値を取得し、それらからSharedPreferences
に完全に新しいエントリを作成します。 「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-array name="user_values">
<item>@string/value_1</item>
<item>@string/value_2</item>
</string-array>
文字列と文字列配列の操作 を参照してください