Using list preference in Android

后端 未结 3 1728
-上瘾入骨i
-上瘾入骨i 2020-12-24 13:09

I have a text to speech application where the user can select a language and also select a male or female voice. The problem is that for each language there are different st

相关标签:
3条回答
  • Ok, you can accomplish this with two ListPreferences and an OnPreferenceChangeListener for each. First the 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"/>
    

    Let's make a new entry in res/values/array.xml:

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

    And now in your extention of PreferenceActivity, we're going to take the string values which persist in your SharedPreferences and from them create a completely new entry in the SharedPreferences which gets its value from "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 讨论(0)
  • 2020-12-24 13:38

    Sorry, I'm not able to comment on an answer yet, so I open a new one.

    Instead of writing your own algorithm in order to find the index of a particular item in a String array just rely on the standard API (it's usually faster, better design and just shorter):

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

    It's the same as :

    int a = 0
    
    for (a ; a < languageAlias.length ; a++) {
        if (languageAlias[a].equals(languageData) {
            break;
        }
    }
    
    0 讨论(0)
  • 2020-12-24 14:02

    String arrays can use string resources. This is the easiest (and probably simplest) way to translate user values.

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

    See Working with Strings and String Arrays

    0 讨论(0)
提交回复
热议问题