2012-03-26 2 views
23

में सूची वरीयता का उपयोग करना मेरे पास भाषण एप्लिकेशन के लिए एक पाठ है जहां उपयोगकर्ता एक भाषा का चयन कर सकता है और नर या मादा आवाज भी चुन सकता है। समस्या यह है कि प्रत्येक भाषा के लिए नर और मादा आवाज कहने के लिए अलग-अलग तार होते हैं लेकिन मेरी वरीयता में मेरे पास केवल दो विकल्प होते हैं (नर और मादा)।एंड्रॉइड

<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> 

मैं चयनित भाषा के आधार पर प्रासंगिक नर और मादा आवाजअलीस को संदर्भित करने का एक तरीका खोजने का प्रयास कर रहा हूं। क्या यह यहां करना संभव है या क्या मुझे कुछ कोड लिखना है जो चयनित भाषा के आधार पर आवाजअलीस सरणी के मानों को बदलता है?

अग्रिम धन्यवाद

उत्तर

46

ठीक है, तुम दोनों ListPreference और प्रत्येक के लिए एक OnPreferenceChangeListener साथ ऐसा कर सकते हैं। सबसे पहले एक्सएमएल:

<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(); 
    } 
}); 
+0

धन्यवाद, मुझे दृष्टिकोण पसंद है। हालांकि कोड की यह पंक्ति क्या करती है? आवाजअलीस [(2 * ए) + लिंगडाटा] – Amanni

+0

लूप के लिए परिभाषित किया गया है और यह भाषा एलास के भीतर भाषा डेटा की अनुक्रमणिका का प्रतिनिधित्व करता है। भाषा के माध्यम से लूप चक्र जब तक यह भाषा डेटा का मूल्य नहीं पाता है। एक के मूल्य को दो से गुणा किया जाता है क्योंकि वॉयस एलीस के भीतर जोड़े में आवाज मौजूद होती है। लिंगदाटा इसमें जोड़ा गया है। यदि उपयोगकर्ता ने पुरुष चुना है, 0 जोड़ा गया है और भाषा जोड़ी का पहला विकल्प लिया गया है। अगर मादा, 1 जोड़ा जाता है। – gobernador

+1

दस्तावेज़ों पर थोड़ा करीब देखने के बाद, ऐसा लगता है कि 'ListPreference' स्ट्रिंग को जारी रखना चाहता है। यदि आपको लगता है कि यह मामला है, तो '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 सरणी में किसी विशेष आइटम के सूचकांक को खोजने के लिए सिर्फ मानक एपीआई पर भरोसा करते हैं अपनी खुद की एल्गोरिथ्म लिखने की

(यह आम तौर पर तेज है, बेहतर डिजाइन और सिर्फ कम):

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

नीचे बाइनरी खोज नहीं है। और @ गोबेर्नडोर, नहीं, यह नहीं होगा। – Linxy