অ্যান্ড্রয়েড তালিকা পছন্দসমূহ: নির্বাচিত মান হিসাবে সংক্ষিপ্তসার আছে?


112

আমার একটি পছন্দের ক্রিয়াকলাপ রয়েছে যা আমার এক্সএমএল ফাইল দ্বারা সংজ্ঞায়িত হিসাবে তালিকা পছন্দগুলি ব্যবহার করে। আমি তালিকা ক্রিয়াকলাপের সংক্ষিপ্তসারটি কীভাবে নির্বাচিত মান হিসাবে সেট করব?

ধন্যবাদ!

উত্তর:


410

এটি করার সহজ উপায় হ'ল অ্যান্ড্রয়েডটি আপনার জন্য এটি করা। ধরে নেওয়া যাক আপনি সারসংক্ষেপ মান নির্বাচিত মেলে চান, আপনি কেবল পারেন সারাংশ সেট ListPreferenceকরতে"%s" পারেন XML বা ব্যবহার 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 এর চয়নকারী । আপনি ক্রিয়াকলাপটি প্রবেশ করার সময় তালিকার সংক্ষিপ্তসারটিও সঠিকভাবে সেট করা হবে initially আপনাকে প্রাথমিকভাবে সেট আপ করতে কোনও বিশেষ কোড লিখতে হবে না।

এটি অ্যান্ড্রয়েডএক্স-এর সাথেও কাজ করে ListPreference

আমি কাটিয়েছি পর্যন্ত সঙ্গে mucking খুব বেশি সময় SharedPreferencesশ্রোতারা আগে আমি এই আবিষ্কার করেন।


1
আমি জানি! আমি সেই মার্জিত সমাধান পছন্দ করি। এত সহজ, সন্ধান করা এখনও কঠিন;)
সাবলীলভাবে

7
আমাকে এই বুদ্ধি ম্যানুয়াল
আপডেটিংটি

4
দুর্দান্ত উত্তর। বিশ্বাস করুন বা না করুন তবে এটি প্রকৃতপক্ষে
দলিলযুক্ত

1
আপনি কি নিশ্চিত করতে পারেন যে আপনার জন্য API> = 11 দরকার "%s"? আমার পরীক্ষাগুলিতে, "%s"জিনজারব্রেড এবং পূর্ববর্তী সংস্করণগুলির সাথে কাজ করে না।
andreas1724

1
মাথা ব্যাথা করার জন্য @ ব্যাপটিস্টে ক্যানডেলিয়র ধন্যবাদ জানায়। যদি কিছু বিদ্যমান থাকে তবে অ্যান্ড্রয়েড দল এটিকে হ্রাস করবে। আমি একটি লিঙ্ক যুক্ত করেছি 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

প্রথমে আপনার অনক্রিটটিতে তালিকার পূর্বনির্ধারনের একটি রেফারেন্স পান। আপনি FindPreferences () ব্যবহার করতে পারেন। উদাহরণ স্বরূপ:

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);
        }

এক্সএমএল লেআউট

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

এখানে মিডহানহকের উত্তরের একটি প্রসারিত সংস্করণ যা সহায়ক "অ্যান্ড্রয়েড: সংক্ষিপ্ত" স্ট্রিংকেও সম্বোধন করে

        // 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'";
...

এবং, কেবল পরিষ্কার হতে হবে, অ্যান্ড্রয়েড: সংক্ষিপ্ততা সম্পর্কিত এক্সএমএল থেকে সরানো হয়েছে।


0

এবং ব্যবহারকারীর নির্বাচনের পরে রিংটোন পছন্দের সংক্ষিপ্ত আপডেটটি মোকাবেলার একটি উপায় one

    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

আপনি আপনার পছন্দের কার্যকলাপের উপর একটি পদ্ধতির বাইন্ড প্রেফারেন্সসামারি টুভ্যালু রেখেছেন,

আপনি সহজেই লিস্টগুলিতে লিখিতভাবে सारটি যুক্ত করতে পারেন:

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

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

আপনার অনক্রেট পদ্ধতিতে আপনি বাঁধন ফাংশনটিকে এভাবে কল করেন:

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]);
      }
    }
 }  
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.