Android सूची वरीयताएँ: चयनित मूल्य के रूप में सारांश है?


112

मेरे पास एक प्राथमिकता गतिविधि है जो मेरी XML फ़ाइल द्वारा परिभाषित सूची वरीयता का उपयोग करती है। मैं सूची गतिविधि के सारांश को उस मूल्य पर कैसे सेट करूंगा जो चयनित है?

धन्यवाद!

जवाबों:


410

ऐसा करने का सबसे सरल तरीका यह है कि एंड्रॉइड यह आपके लिए है। यदि आप चाहते हैं कि सारांश चयनित मूल्य से मेल खाता है, तो आप केवल XML या जावा में विधि का उपयोग करने के ListPreferenceलिए सारांश सेट"%s" कर सकते हैं setSummary। उदाहरण के लिए:

<ListPreference
    android:key="pref_list"
    android:title="A list of preferences"
    android:summary="%s"
    android:entries="@array/pref_list_entries"
    android:entryValues="@array/pref_list_entries_values"
    android:defaultValue="0" />

एंड्रॉइड %sवरीयता के वर्तमान स्ट्रिंग मूल्य के साथ बदल देगा , जैसा कि ListPreferenceबीनने वाले द्वारा प्रदर्शित किया गया है । गतिविधि में प्रवेश करने पर सूची का सारांश भी सही ढंग से सेट हो जाएगा - आपको इसे शुरू में सेट करने के लिए कोई विशेष कोड लिखने की आवश्यकता नहीं है।

यह भी AndroidX के साथ काम करता हैListPreference

मैं बिताया अब तक के साथ mucking बहुत अधिक समय SharedPreferencesश्रोताओं इससे पहले कि मैं इस खोज की।


1
मुझे पता है! मुझे उन सुरुचिपूर्ण समाधानों से प्यार है। इतना सरल, अभी तक खोजने के लिए मुश्किल;)
शायद ही कभी

7
मुझे इस विट मैनुअल को अपडेट करना था ... क्योंकि वैल्यू में बदलाव होने पर सारांश अपडेट नहीं किया जाता ...
Renetik

4
बहुत बढ़िया जवाब। मानो या न मानो लेकिन यह वास्तव में प्रलेखित है: developer.android.com/reference/android/preference/…
Lior

1
क्या आप पुष्टि कर सकते हैं, कि आपको API> = 11 की आवश्यकता है "%s"? मेरे परीक्षणों में, "%s"जिंजरब्रेड और पुराने संस्करणों के साथ काम नहीं करता है।
andreas1724

1
@BaptisteCandellier सिर के लिए धन्यवाद। यदि कुछ मौजूद है, तो एंड्रॉइड टीम इसे हटा देगी। मैंने एक लिंक जोड़ा है androidx
जॉर्ज हिलियार्ड

29

आप OnPreferenceChangeListenerसारांश को गतिशील रूप से बदलने के लिए उपयोग कर सकते हैं । समस्या यह है कि इसे चयनित मूल्य (से android:entryValues) मिलता है, न कि कैप्शन ( android:entries)। निम्नलिखित कोड में मैंने उपयोग किया है toString(), लेकिन उचित समाधान मूल्य के लिए कैप्शन को खोजना है। वैसे भी, विचार काम करता है:

public class Preferences extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.your_prefs);

        ListPreference listPreference = (ListPreference) findPreference("preference_key");
        if(listPreference.getValue()==null) {
            // to ensure we don't get a null value
            // set first value by default
            listPreference.setValueIndex(0);
        }
        listPreference.setSummary(listPreference.getValue().toString());
        listPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                preference.setSummary(newValue.toString());
                return true;
            }
        });
    }
}

18

मैं भी कुछ ऐसा ही हासिल करना चाहता था, लेकिन https://stackoverflow.com/a/8155029/592025 के साथ समस्या यह है कि, यह मेरी प्राथमिकता के लिए मूल्य दिखाता है (जैसे 1, 2 3 आदि)। मैं चयनित मान के अनुरूप प्रविष्टि (मानव पठनीय स्ट्रिंग) दिखाना चाहता हूं।

इसलिए मैंने इसे इस तरह से बदल दिया और जिस तरह से मुझे इसकी आवश्यकता है, काम करता है।

listPreference.setSummary(servicePreference.getEntry().toString());
listPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            // Set the value as the new value
            listPreference.setValue(newValue.toString());
            // Get the entry which corresponds to the current value and set as summary
            preference.setSummary(listPreference.getEntry());
            return false;
        }
    });

मान को बदलने और मान को स्पष्ट रूप से सेट करने और प्रविष्टि को वापस पढ़ने के लिए getEntry()इसके बजाय चाल का उपयोग करना है getValue()


8

मुझे लगता है कि आप जो खोज रहे हैं वह बहुत सरल है जिसे आप सोच सकते हैं, अपने Preferenceआइटम में निम्न कोड लाइन जोड़ें :

android:summary="%1$s"

तो यह कुछ इस तरह दिखेगा:

<ListPreference
            android:key="@string/pref_temp_key"
            android:title="@string/pref_temp_title"
            android:dialogTitle="@string/pref_temp_dialog_title"
            android:entries="@array/pref_tempUnit_entries"
            android:entryValues="@array/pref_tempUnit_entries"
            android:summary="%1$s"
            android:defaultValue="@string/pref_temp_default_value" />

4

पहले अपने onCreate में ListPreference का संदर्भ लें। आप findPreference () का उपयोग कर सकते हैं। उदाहरण के लिए:

ListPreference pref = (ListPreference) findPreference("thePreferencesKey");

फिर, जब आप पहली बार गतिविधि को लोड करते हैं और जब भी वरीयताओं का मूल्य बदल जाता है, तो आप जिस भी विधि का उपयोग करना चाहते हैं, उसका उपयोग करें सूची सूची के मूल्य और इसके साथ सारांश सेट करें:

pref.setSummary(theNewString);

2

यह वह कोड है जिसका मैं उपयोग कर रहा हूं, यह सेटवैल्यू को मैन्युअल रूप से कॉल नहीं करता है, क्योंकि मेरा मानना ​​है कि यह पहले से ही बाद के चरण में किया गया है।

यहाँ एक उदाहरण है:

@Override
public boolean onPreferenceChange(Preference preference, Object value)
{
    String textValue = value.toString();

    ListPreference listPreference = (ListPreference) preference;
    int index = listPreference.findIndexOfValue(textValue);

    CharSequence[] entries = listPreference.getEntries();

    preference.setSummary(
                index >= 0
                        ? entries[index]
                        : null);

    return true;
}

0

यह वही है जो मैंने किया था और यह बहुत अच्छा काम करता है। में onSharedPreferenceChangeListener मैं सिर्फ क्या बदल रहा है की कुंजी जाँच और फिर ListPreferences मानव पठनीय (entryValue के बजाय प्रवेश) के लिए वापस परिवर्तित के लिए अगर बयान के साथ। बहुत साधारण।

public class MyPreferences extends PreferenceFragment implements OnSharedPreferenceChangeListener{

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);
    context = getActivity();

    if (context == null){
        Log.e("error","context is null");
    }

    prefs = PreferenceManager.getDefaultSharedPreferences(context);
    myFrequencyList = (Preference)  findPreference("frequency_key");
    prefs.registerOnSharedPreferenceChangeListener(this);

}


@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
        String key) {

        if(key.equals("frequency_key")){
                String freq = sharedPreferences.getString("frequency_key", "8k Hz");
                if(freq.equals("8000")){
                    freq = "8k Hz";
                }
                else if(freq.equals("16000")){
                    freq = "16k Hz";
                }
                else if(freq.equals("22050")){
                    freq = "22.05k Hz";
                }
                else if(freq.equals("44100")){
                    freq = "44.1k Hz";
                }
                else if(freq.equals("48000")){
                    freq = "48k Hz";
                }
                else{
                    freq = "8k Hz";
                }
                myFrequencyList.setSummary(freq);
        }

xml लेआउट

 <ListPreference android:id="@+id/frequency_list"
        android:key="frequency_key"
        android:summary="8000"
        android:title="Sample Rate"
        android:defaultValue="8000"
        android:dialogTitle="Larger sample rates create better sound quality but larger file sizes."
        android:entries="@array/freq_titles"
        android:entryValues="@array/freq_values"
        />

xml सरणी

<?xml version="1.0" encoding="utf-8"?>

<string-array name="freq_titles">
    <item>48k Hz</item>
    <item>44.1k Hz</item>
    <item>22.05k Hz</item>
    <item>16k Hz</item>
    <item>8k Hz</item>
</string-array>

<string-array name="freq_values">
    <item>48000</item>
    <item>44100</item>
    <item>22050</item>
    <item>16000</item>
    <item>8000</item>
</string-array>


1
आदर्श रूप से आप सारांश को गतिशील रूप से पढ़ेंगे ताकि आपको इसे दो स्थानों पर न रखना पड़े।
जॉर्ज हिलियार्ड

0

यहाँ midhunhk के उत्तर का एक विस्तारित संस्करण है जो सहायक "android: सारांश" स्ट्रिंग को भी संबोधित करता है

        // Retrieve & populate flash modes
        List<String> flashmodes = params.getSupportedFlashModes();
        if (flashmodes != null) {
            final ListPreference lp = (ListPreference) findPreference("flash_list");
            final String lp_basesummary = "Set the Flash mode. The default is 'auto'";

            lp.setEntries(flashmodes.toArray(new CharSequence[flashmodes.size()]));
            lp.setEntryValues(flashmodes.toArray(new CharSequence[flashmodes.size()]));
            // If there's only one option, make it the default
            if (flashmodes.size() == 1)
                lp.setValueIndex(0);

            lp.setSummary(lp_basesummary + " [" + lp.getEntry() + "]");

            lp.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue) {
                    // Set the value as the new value
                    lp.setValue(newValue.toString());
                    // Get the entry which corresponds to the current value
                    // and set as summary
                    preference.setSummary(lp_basesummary + " [" + lp.getEntry() + "]");
                    return false;
                }
            });
        } else {
            // Remove the preference
            ((PreferenceGroup) findPreference("camera_preference")).removePreference(findPreference("flash_list"));
        }

        // Retrieve & populate focus modes
        List<String> focusmodes = params.getSupportedFocusModes();
        if (focusmodes != null) {
            final ListPreference lp = (ListPreference) findPreference("focus_mode_list");
            final String lp_basesummary = "Set the Focus mode. The default is 'auto'";
...

और, बस स्पष्ट होने के लिए, Android: सारांश संबंधित xml से हटा दिया जाता है।


0

और यहाँ उपयोगकर्ता के चयन के बाद रिंगटोन वरीयता के सारांश अपडेट से निपटने का एक तरीका है।

    final SharedPreferences preference = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

    final RingtonePreference rp_shuttle = (RingtonePreference) findPreference("shuttle_tone");
    rp_shuttle.setSummary(RingtoneManager
            .getRingtone(getApplicationContext(), Uri.parse(preference.getString("shuttle_tone", "DEFAULT_SOUND")))
            .getTitle(this));

    rp_shuttle.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

        public boolean onPreferenceChange(Preference mypreference, Object newValue) {
            rp_shuttle.setSummary(RingtoneManager.getRingtone(getApplicationContext(), Uri.parse(newValue + ""))
                    .getTitle(getApplicationContext()));

            return true;
        }
    })

0

आप अपनी पसंद पर एक विधि bindPreferenceSummaryToValue को हावा दें,

आप इस तरह से सूची में सारांश को आसानी से जोड़ सकते हैं:

private static void bindPreferenceSummaryToValue(Preference preference) {
    preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);

    sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
            PreferenceManager
                    .getDefaultSharedPreferences(preference.getContext())
                    .getString(preference.getKey(), ""));
}

Yout OnCreate मेथड पर आप इस तरह से बाइंड फंक्शन को कॉल करते हैं:

bindPreferenceSummaryToValue(findPreference(getString(R.string.KEY_OF_THE_LIST)));

आप उसी तरह दूसरों के सारांश को आसानी से जोड़ सकते हैं:

bindPreferenceSummaryToValue(findPreference(getString(R.string.KEY_1)));
bindPreferenceSummaryToValue(findPreference(getString(R.string.KEY_2)));
bindPreferenceSummaryToValue(findPreference(getString(R.string.KEY_3)));

0

onCreatePreferences के तहत ऐसा करते हैं ::

SharedPreferences sharedPreferences =getPreferenceScreen().getSharedPreferences();
PreferenceScreen prefScreen = getPreferenceScreen();
int count = prefScreen.getPreferenceCount();

for (int i = 0; i < count; i++) {
  Preference p = prefScreen.getPreference(i);
    if (p instanceof ListPreference) {
       String value = sharedPreferences.getString(p.getKey(), "");
       ListPreference listPreference = (ListPreference) preference;
       int prefIndex = listPreference.findIndexOfValue(stringValue);
       if (prefIndex >= 0) {
            preference.setSummary(listPreference.getEntries()[prefIndex]);
      }
    }
 }  
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.