2012-03-26 78 views
23

我有一個文本到語音應用程序,用戶可以選擇一種語言並選擇一個男性或女性的聲音。問題在於,對於每種語言都有不同的字符串用於稱呼男性和女性的聲音,但在我的偏好中,我只有兩種選擇(男性和女性)。在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

好吧,你可以用兩個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一個新的條目:

<string-array name="VoiceData"> 
    <item>0</item> 
    <item>1</item> 
</string-array> 
在你的 PreferenceActivity extention

而現在,我們要採取的字符串值,其堅持你的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 2012-03-26 23:34:05

+0

a的值在for循環中定義,它代表languageAlias中的languageData的索引。循環遍歷languageAlias直到找到languageData的值。 a的值乘以2,因爲voiceAlias中的聲音是成對存在的。 genderData添加到此。如果用戶選擇男性,則添加0,並獲取語言對的第一個選項。如果是女性,則添加1。 – gobernador 2012-03-27 01:42:58

+1

在看了一下文檔後,它看起來像'ListPreference'想要保持一個字符串。如果您發現這種情況,只需用'Integer.parseInt(shareprefs.getString ...)'包裝'genderData'的聲明' – gobernador 2012-03-29 03:09:58

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 2015-06-23 15:32:20

+2

以下不是二進制搜索。和@gobernador,不,它不會。 – Linxy 2016-10-07 18:02:35

相關問題