2012-03-26 3 views
23

私は、ユーザーが言語を選択したり、男性または女性の声を選択することができる音声合成アプリケーションを使用しています。問題は、言語ごとに男性と女性の声を呼び出すために使用されるさまざまな文字列がありますが、私の好みでは2つのオプション(男性と女性)しかありません。Androidでリストの設定を使用する

<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配列の値を変更するコードを記述する必要がありますか?事前に

おかげ

答えて

46

[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 /値/ array.xmlに新しいエントリしてみましょう:PreferenceActivityのあなたの拡張子で

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

そして今は、我々はその文字列の値を取るつもりです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(); 
    } 
}); 
+0

ありがとう、私はアプローチが好きです。しかし、このコード行は何をしていますか? voiceAlias [(2 * a)+ genderData] – Amanni

+0

aの値はforループで定義され、languageAlias内のlanguageDataのインデックスを表します。ループはlanguageDataの値を見つけるまでlanguageAliasを循環します。 voiceAlias内に音声がペアで存在するため、aの値には2が乗算されます。これにgenderDataが追加されます。ユーザーが男性を選択した場合、0が追加され、言語ペアの最初のオプションが使用されます。女性の場合は1が加算されます。 – gobernador

+1

ドキュメントを少し見て、 'ListPreference'が文字列を永続化したいように見えます。これが当てはまる場合は、 'genderData'の宣言を' Integer.parseInt(shareprefs.getString ...) 'で囲みます。 – gobernador

7

文字列配列は文字列リソースを使用できます。これは、ユーザーの値を変換する最も簡単な(そしておそらく最も単純な)方法です。

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

Working with Strings and String Arrays

-1

を参照してください。申し訳ありませんが、私はまだ答えにコメントすることはできませんので、私は新しいものを開きます。代わりにString配列内の特定の項目のインデックスを見つけるために、独自のアルゴリズムを書くの

ちょうど標準API(それは、より速く、通常より良いデザインとだけ短いです)に依存している:それは

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

同じ:

int a = 0 

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

ソートされていないデータに対してバイナリ検索が動作しますか? – gobernador

+2

以下はバイナリ検索ではありません。と@gobernador、それはできません。 – Linxy

関連する問題