অগ্রাধিকারের সারাংশে আমি কীভাবে একটি Android পছন্দক্রমের বর্তমান মানটি প্রদর্শন করব?


457

এটি অবশ্যই প্রায়শই উঠে আসে।

যখন ব্যবহারকারী কোনও অ্যান্ড্রয়েড অ্যাপ্লিকেশনটিতে অগ্রাধিকারগুলি সম্পাদনা করছেন, আমি তাদের পছন্দ করতে চাই যে Preferenceসংক্ষিপ্তসারগুলিতে অগ্রাধিকারের বর্তমান নির্ধারিত মানটি তারা দেখতে পাবে ।

উদাহরণ: যদি আমার কাছে "পুরানো বার্তাগুলি বাতিল করুন" এর জন্য পছন্দসই সেটিংস থাকে যা বার্তাগুলি পরিষ্কার করার দরকার পরে কত দিন নির্দিষ্ট করে। ইন PreferenceActivityআমি দেখতে ব্যবহারকারী চাই:

"পুরানো বার্তা বাতিল করুন" <- শিরোনাম

" X দিন পরে বার্তাগুলি পরিষ্কার করুন " <- সারাংশ যেখানে এক্স বর্তমান পছন্দসই মান

অতিরিক্ত জমা

উত্তর:


151

এটি আরও সাধারণ সমাধান করার উপায় রয়েছে, যদি এটি আপনার প্রয়োজন অনুসারে চলে।

উদাহরণস্বরূপ, আপনি যদি সমস্ত তালিকা পছন্দগুলি সংক্ষিপ্তসার হিসাবে তাদের পছন্দগুলি প্রদর্শন করতে চান তবে আপনার onSharedPreferenceChangedপ্রয়োগের জন্য আপনার এটি থাকতে পারে :

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    Preference pref = findPreference(key);

    if (pref instanceof ListPreference) {
        ListPreference listPref = (ListPreference) pref;
        pref.setSummary(listPref.getEntry());
    }
}

এটি অন্যান্য পছন্দ শ্রেণীর কাছে সহজেই বর্ধমান।

আর ব্যবহার করে getPreferenceCountএবং getPreferenceএ কার্যকারিতা PreferenceScreenএবং PreferenceCategory, আপনি সহজেই একটি জেনেরিক ফাংশন পক্ষপাত গাছ ধরনের সব পছন্দগুলি সারাংশ আপনি তাদের ইচ্ছা সেটিং হেটে যেতে লিখতে পারে toStringউপস্থাপনা


6
সত্যিই চমৎকার সমাধান। কেবলমাত্র একটি আরম্ভের অভাব রয়েছে
njzk2

9
@ njzk2 আপনাকে যা করতে হবে তা নিশ্চিত করুন কার্যকলাপটিimplements OnSharedPreferenceChangeListener

4
এনবি: একটি সহজ উপায় আছে, দেখুন @ রবার্টাসের উত্তর
সালমান ভন আব্বাস

6
প্রকৃতপক্ষে, আপনি এর "%s"জন্য সারাংশ সেট করতে পারেন ListPreference, এবং ListPreference.getSummary()বর্তমান নির্বাচিত এন্ট্রি (বা ""যদি না নির্বাচিত হয়) এর সাথে সারাংশটি ফর্ম্যাট করবেন ।
সফট

FindPreferences (কী) অবমূল্যায়ন করা হয়েছে, এটি অ্যাক্সেস করার অন্য কোনও উপায় আছে কি?
নেভারমোর

144

এখানে আমার সমাধান ... FWIW

package com.example.PrefTest;

import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceGroup;
import android.preference.PreferenceManager;

public class Preferences extends PreferenceActivity implements
        OnSharedPreferenceChangeListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
        PreferenceManager.setDefaultValues(Preferences.this, R.xml.preferences,
            false);
        initSummary(getPreferenceScreen());
    }

    @Override
    protected void onResume() {
        super.onResume();
        // Set up a listener whenever a key changes
        getPreferenceScreen().getSharedPreferences()
                .registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        // Unregister the listener whenever a key changes
        getPreferenceScreen().getSharedPreferences()
                .unregisterOnSharedPreferenceChangeListener(this);
    }

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
            String key) {
        updatePrefSummary(findPreference(key));
    }

    private void initSummary(Preference p) {
        if (p instanceof PreferenceGroup) {
            PreferenceGroup pGrp = (PreferenceGroup) p;
            for (int i = 0; i < pGrp.getPreferenceCount(); i++) {
                initSummary(pGrp.getPreference(i));
            }
        } else {
            updatePrefSummary(p);
        }
    }

    private void updatePrefSummary(Preference p) {
        if (p instanceof ListPreference) {
            ListPreference listPref = (ListPreference) p;
            p.setSummary(listPref.getEntry());
        }
        if (p instanceof EditTextPreference) {
            EditTextPreference editTextPref = (EditTextPreference) p;
            if (p.getTitle().toString().toLowerCase().contains("password"))
            {
                p.setSummary("******");
            } else {
                p.setSummary(editTextPref.getText());
            }
        }
        if (p instanceof MultiSelectListPreference) {
            EditTextPreference editTextPref = (EditTextPreference) p;
            p.setSummary(editTextPref.getText());
        }
    }
}

এটি @ অ্যাডিবি দুর্দান্ত কাজ করে ... এ ছাড়া আমার একটি পছন্দ স্ক্রিনের মধ্যে একটি পছন্দ পর্দা রয়েছে। কীভাবে অভ্যন্তরীণ পছন্দ স্ক্রিনে পৌঁছাবেন এবং সংক্ষিপ্তসারগুলি সেগুলি কীভাবে বর্ধিত করবেন?
তারালোকা

@taraloca - পরিবর্তন করুন (p উদাহরণস্বরূপ পছন্দশ্রেণীশ্রেণী) C পছন্দসামগ্রী pCat = (পছন্দশ্রেণী) p; to if (p উদাহরণFenderGroup) {চূড়ান্ত পছন্দগ্রুপ পিটিজিপি = (পছন্দগ্রুপ) পি;
মার্টিন অ্যাডিলা

এই কাজ করছে মহান কি যদি EditTextPreferenceহয় android:password="true" এটা মান দেখায়
Chathura Wijesinghe

1
কোনও মান সংজ্ঞায়িত না করা হলে (যেমন if editTextPref.getText() == "") সংস্থান (এক্সএমএল) ফাইল থেকে সংক্ষিপ্তসার প্রদর্শনের জন্য কোডটি কীভাবে পরিবর্তন করব ? কিভাবে সংক্ষিপ্ত মান পেতে updatePrefSummary? p.getSummary()এবং editTextPref.getSummary()ইতিমধ্যে পরিবর্তিত মানগুলি ফেরত দিন।
এলএ_

যেহেতু উভয়ই PreferenceCategoryএবং PreferenceScreenউত্তরাধিকার সূত্রে প্রাপ্ত PreferenceGroup, তাই আমি পরিবর্তে initSummaryএকটি পরিবর্তিত হ্যান্ডেল করেছি PreferenceGroup। এটি অন্য লুপ ইন প্রয়োজন এড়ানো onCreate()। আচরণে পরিবর্তন: নীড়যুক্ত পছন্দস্ক্রীন এখন পুনরাবৃত্তির সাথে পরিচালিত হয়।
লেকেনস্টেইন

96

অ্যান্ড্রয়েড ডকুমেন্টেশন বলছে যে এতে একটি স্ট্রিং ফর্ম্যাটিং মার্কার ব্যবহার করতে পারে getSummary():

যদি সংক্ষিপ্তসারটিতে একটি স্ট্রিং ফর্ম্যাটিং মার্কার থাকে (যেমন "% s" বা "% 1 $ s"), তবে বর্তমান প্রবেশ মূল্যটি তার জায়গায় প্রতিস্থাপিত হবে।

কেবলমাত্র android:summary="Clean up messages after %s days"লিস্টপ্রিফারেন্স xML ঘোষণায় নির্দিষ্ট করে দেওয়া আমার পক্ষে কাজ করেছিল।

দ্রষ্টব্য: এটি শুধুমাত্র এর জন্য কাজ করে ListPreference


কেউ ভুল হলে আমি আমাকে সংশোধন করি, তবে getSummary () এর নথিতে বলা হয়েছে যে এটি এপিআই স্তরে যুক্ত করা হয়েছিল। আপনি কি বোঝাচ্ছেন যে প্রথম প্রকাশের সময় আচরণটি আলাদা ছিল?
TheIT

10
দুর্ভাগ্যক্রমে, এটি কেবল তালিকাপ্রিফারেন্সের জন্য কাজ করে। আমি editTextPreferences জন্য একই আচরণ চান। অবাক করা বিষয় যে গুগল এটি সমস্ত ডায়ালগপ্রিফারেন্সির জন্য যুক্ত করে নি।
ভিকি

2
এছাড়াও, আমি যতক্ষণ মান সেট করা হয়নি ততক্ষণ কাজ করব না - পছন্দক্রমিক ক্রিয়াকলাপের প্রথম কলটিতে এটি কেবল% s প্রদর্শন করে যা সত্যিই বোবা।
জোর্ডিড

3
@ জোর্ডিড এটিকে android:defaultValue="0"আপনার লিস্টপ্রিফেরেন্সের মতো আপনার এক্সএমএলে ডিফল্ট মান নির্দিষ্ট করে নির্দিষ্ট করা যেতে পারে । এটি সবচেয়ে বুদ্ধিমান উত্তর এবং আমার জন্য কাজ করে।
মোহিত সিং 12

@ মোহিত সিং / @ জোরিদিড, ললিপপ এপিআই 22 তে, defaultValueএবং %sকাজ করে না। অন্যান্য সংস্করণগুলিতে, সাধারণত এটি কাজ করে। কোন সমাধান দয়া করে? আমি নিশ্চিত এটির জন্য একটি কাস্টম ক্লাস লিখতে চাই না। অবিশ্বাস্য যে গুগল এই ধরনের ব্যথার মধ্যে সবচেয়ে তুচ্ছ কাজ করে।
নারায়ণ জে

81

আপনি যদি ব্যবহার করেন তবে PreferenceFragmentআমি এটি সমাধান করব how এটি স্ব-ব্যাখ্যামূলক।

public static class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      addPreferencesFromResource(R.xml.settings);
      getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onResume() {
      super.onResume();
      for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); ++i) {
        Preference preference = getPreferenceScreen().getPreference(i);
        if (preference instanceof PreferenceGroup) {
          PreferenceGroup preferenceGroup = (PreferenceGroup) preference;
          for (int j = 0; j < preferenceGroup.getPreferenceCount(); ++j) {
            Preference singlePref = preferenceGroup.getPreference(j);
            updatePreference(singlePref, singlePref.getKey());
          }
        } else {
          updatePreference(preference, preference.getKey());
        }
      }
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
      updatePreference(findPreference(key), key);
    }

    private void updatePreference(Preference preference, String key) {
      if (preference == null) return;
      if (preference instanceof ListPreference) {
        ListPreference listPreference = (ListPreference) preference;
        listPreference.setSummary(listPreference.getEntry());
        return;
      }
      SharedPreferences sharedPrefs = getPreferenceManager().getSharedPreferences();
      preference.setSummary(sharedPrefs.getString(key, "Default"));
    }
  }

3
এই সমাধানটির আরও ভোটের প্রয়োজন ... এটি আমাকে বাগড করে যে বিকাশকারী সাইটের উদাহরণগুলি এটি করা হচ্ছে দেখায়, তবে এটি সম্পূর্ণরূপে বাদ দেয়।
জাস্টিন স্মিথ

3
EditTextPreferences আপডেট করার জন্য এটিকে updatePreferenceCODE if (preference instanceof EditTextPreference) { EditTextPreference editTextPref = (EditTextPreference) preference; preference.setSummary(editTextPref.getText()); }ধন্যবাদ যোগ করুন @ এডিবিবি
ইউজিন ভ্যান ডের

6
আপনি কোথায় ফোন করবেন unregisterOnSharedPreferenceChangeListener?
ক্যাম্পাপ

1
findPreference(CharSequence key) This method was deprecated in API level 11. This function is not relevant for a modern fragment-based PreferenceActivity.
DSlomer64

2
@ ডিএসলমোর 64৪ আপনি কী উদ্ধৃত করছেন সে সম্পর্কে আমি ভালভাবে অবগত। এটি আপনাকে PreferenceActivity.findPreference(এবং বেশ কয়েকটি অন্যান্য পদ্ধতি) ব্যবহার না করার জন্য বলছে , কারণ গুগল আপনাকে এই উত্তরটিতে প্রদর্শিত কৌশলটিতে স্যুইচ করতে চায় যা PreferenceFragment.findPreferenceপরিবর্তে ব্যবহার করে।
ড্যান হুলমে

33

আমার বিকল্পটি তালিকার প্রসারকে প্রসারিত করা এবং এটি পরিষ্কার:

public class ListPreferenceShowSummary extends ListPreference {

    private final static String TAG = ListPreferenceShowSummary.class.getName();

    public ListPreferenceShowSummary(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public ListPreferenceShowSummary(Context context) {
        super(context);
        init();
    }

    private void init() {

        setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

            @Override
            public boolean onPreferenceChange(Preference arg0, Object arg1) {
                arg0.setSummary(getEntry());
                return true;
            }
        });
    }

    @Override
    public CharSequence getSummary() {
        return super.getEntry();
    }
}

তারপরে আপনি আপনার সেটিংসে যোগ করুন x এক্সএমএল:

<yourpackage.ListPreferenceShowSummary
    android:key="key" android:title="title"
    android:entries="@array/entries" android:entryValues="@array/values"
    android:defaultValue="first value"/>

আমি এর ভিত্তিতে একটি সমাধান করেছি made আমার সমাধানে আমার মেনু এবং সংক্ষিপ্তসার দুটিতে এন্ট্রি স্ট্রিং ব্যবহার না করে এন্ট্রিসুমারিগুলির একটি অ্যারে সেট করার একটি পদ্ধতি রয়েছে। এখানে একটি সমস্যা রয়েছে: getEntry () নতুন মানটি না দিয়ে পূর্ববর্তী মানটি প্রদান করে।
pzulw

1
আসলে কি init () এমনকি প্রয়োজনীয়? আমি সবেমাত্র getSummary () কে ছাড়িয়েছি এবং এটি সম্ভবত প্রাকৃতিকভাবে কাজ করছে!
অ্যান্ডি

4
সর্বাধিক ভোট দেওয়া চেয়ে অনেক সহজ এবং ক্লিনার সমাধান মনে হচ্ছে!
muslidrikk

2
init()ফাংশন আপডেট করার জন্য প্রয়োজনীয় summaryতখন ব্যবহারকারী যে পক্ষপাত পরিবর্তন। এটি ছাড়াই, এন্ট্রিটি প্রাথমিকভাবে যা ছিল তা কেবল এটি থেকে যাবে।
অ্যান্থনিলাউসন

23

আপনি ডিফল্ট পছন্দ ক্লাসগুলি ওভাররাইড করতে পারেন এবং বৈশিষ্ট্যটি প্রয়োগ করতে পারেন।

public class MyListPreference extends ListPreference  {
    public MyListPreference(Context context) { super(context); }
    public MyListPreference(Context context, AttributeSet attrs) { super(context, attrs); }
    @Override
    public void setValue(String value) {
        super.setValue(value);
        setSummary(getEntry());
    }
}

পরে আপনার xML এ আপনি কাস্টম পছন্দ পছন্দ ব্যবহার করতে পারেন

<your.package.name.MyListPreference 
    android:key="noteInterval"
    android:defaultValue="60"
    android:title="Notification Interval"
    android:entries="@array/noteInterval"
    android:entryValues="@array/noteIntervalValues"
    />

দুর্দান্ত সরল পদ্ধতি। GetEntry স্ট্রিংয়ে% এর মতো বিষয়গুলির জন্য কেবল নজর দিন কারণ তারা সমস্যার কারণ হতে পারে (বা তারা আমার জন্য করেছিল)
অ্যান্ড্রু

21

এই সমস্যাটি সমাধান করতে বেশ কয়েক ঘন্টা পরে আমি এই কোডটি প্রয়োগ করেছি:

[আপডেট: চূড়ান্ত সংস্করণ তালিকা]

public class MyPreferencesActivity extends PreferenceActivity {
    ...
    ListPreference m_updateList;
    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);

        m_updateList = (ListPreference) findPreference(getString(R.string.pref_update_interval_key));
        String currentValue = m_updateList.getValue();
        if (currentValue == null) {
            m_updateList.setValue((String)m_updateList.getEntryValues()[DEFAULT_UPDATE_TIME_INDEX]);
            currentValue = m_updateList.getValue();
        }
        updateListSummary(currentValue);    

        m_updateList.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                updateListSummary(newValue.toString());
                return true;
            }       
        });     
    }

    private void updateListSummary(String newValue) {
        int index = m_updateList.findIndexOfValue(newValue);
        CharSequence entry = m_updateList.getEntries()[index];
        m_updateList.setSummary(entry);
    }
}

এটাই ছিল একমাত্র সমাধান যা আমার পক্ষে কাজ করে। লিস্টপ্রিফারেন্স থেকে সাবক্লাস করার আগে এবং অ্যান্ড্রয়েড বাস্তবায়নের চেষ্টা করার আগে: সারাংশ = "ব্লেজ ব্লেজ% s"। কেউই কাজ করেনি।


আপনার উপায়টি আরও স্পষ্ট এবং অন্যদের পরে কম কোড ব্যবহার করে। উপরের উত্তরগুলি "প্রক্সি" - পছন্দগুলি পরিচালক ব্যবহার করে কাজ করে। এটি তালিকার প্রত্যক্ষ পরিবর্তনের জন্য শোনার মতো পরিষ্কার নয়।
পল আনেকোভ

@ সাবলেট ফক্স, ঝরঝরে সমাধান। আপনি যদি 'সেটডফল্টভ্যালু ()' সেট করেন তবে কৌতুহলীয়, তবে কেন (এসএস == নাল) পরীক্ষা করবেন
স্যামুয়েল

কারণ সেটডাফল্টভ্যালু () সেখানে না থাকা উচিত :) আমি এই কোডটি রিফ্যাকচারিংয়ের আগে রেখেছি
সূক্ষ্ম ফক্স

20

লিস্টপ্রিফারেন্সের মতো হতে পারে: আপনি যা চান তা পেতে getSummary পরিবর্তন করুন:

package your.package.preference;

import android.content.Context;
import android.util.AttributeSet;

public class EditTextPreference extends android.preference.EditTextPreference{
        public EditTextPreference(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }

        public EditTextPreference(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        public EditTextPreference(Context context) {
            super(context);
        }

        @Override
        public CharSequence getSummary() {
            if(super.getSummary() == null) return null;

            String summary = super.getSummary().toString();
            return String.format(summary, getText());
        }
    }

এবং এটি আপনার এক্সএমএলে ব্যবহার করুন:

<your.package.EditTextPreference
                android:key="pref_alpha"
                android:summary="Actual value: %s"
                android:title="Title"
                android:defaultValue="default"
                />

সুতরাং আপনি %sপ্রকৃত মানের পরিবর্তে একটি সংক্ষিপ্তসার লিখতে সক্ষম হবেন ।


1
@ ইরুভানস @ সার্ভ-ইনক কমপক্ষে একটি সাবক্লাস সহ android.support.v7.preference.EditTextPreference, পছন্দগুলি পরিবর্তন করা হয় যখন কেবল পছন্দগুলি ক্রিয়াকলাপটি তৈরি হয় কেবল তখনই सारांशটি আপডেট হয় না। OnSharedPreferenceChangeListener.onSharedPreferenceChangedপছন্দসই খণ্ড শ্রেণিতে প্রয়োগ না করে এর চারপাশের android.support.v7.preference.EditTextPreference.setText(String text)@Override public void setText(String text) { super.setText(text); this.setSummary(this.getText()); }
উপায়টি

@ প্রস্তাবিতরা: সম্পন্ন হয়েছে। কিন্তু এটাও একটি কপি হবে বলে মনে হয় stackoverflow.com/a/21906829/1587329
serv-Inc

18

আপনার নির্বাচিত মানটির সংক্ষিপ্তসারটি সেট করতে হবে এটি কোড। এটি স্টার্টআপে মানগুলিও সেট করে এবং কেবল পরিবর্তনে নয়, ডিফল্ট মানগুলিকেও সম্মান করে। আপনার এক্সএমএল-ফাইলে কেবল "R.layout.prefs" পরিবর্তন করুন এবং আপনার প্রয়োজন অনুসারে সেটস্মোমারি-পদ্ধতি প্রসারিত করুন। এটি আসলে তালিকার অগ্রাধিকারগুলি পরিচালনা করছে তবে অন্যান্য পছন্দগুলি সম্মান করতে এটি কাস্টমাইজ করা সহজ।

package de.koem.timetunnel;

import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceGroup;

public class Prefs 
    extends PreferenceActivity 
    implements OnSharedPreferenceChangeListener {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       this.addPreferencesFromResource(R.layout.prefs);
       this.initSummaries(this.getPreferenceScreen());

       this.getPreferenceScreen().getSharedPreferences()
           .registerOnSharedPreferenceChangeListener(this);
    }

  /**
    * Set the summaries of all preferences
    */
  private void initSummaries(PreferenceGroup pg) {
      for (int i = 0; i < pg.getPreferenceCount(); ++i) {
          Preference p = pg.getPreference(i);
          if (p instanceof PreferenceGroup)
              this.initSummaries((PreferenceGroup) p); // recursion
          else
              this.setSummary(p);
      }
  }

  /**
    * Set the summaries of the given preference
    */
  private void setSummary(Preference pref) {
      // react on type or key
      if (pref instanceof ListPreference) {
          ListPreference listPref = (ListPreference) pref;
          pref.setSummary(listPref.getEntry());
      }
  }

  /**
    * used to change the summary of a preference
    */
  public void onSharedPreferenceChanged(SharedPreferences sp, String key) {
     Preference pref = findPreference(key);
     this.setSummary(pref);
  }

  // private static final String LOGTAG = "Prefs";
}

koem


অনেক ধন্যবাদ! আমি এ থেকে একটি ক্লাস তৈরি করেছি, সংস্থান আইটিটিকে অনক্রিট () - এর পক্ষে আর্গুমেন্ট হিসাবে দিয়েছি - এইভাবে আমার সেটিংস স্ক্রিনগুলিতে সংক্ষেপে মানগুলি প্রদর্শন করার জন্য এটি একটি লাইন পরিবর্তন ছিল।
আসমো সোইনিও

2
বিটিডাব্লু: নোট করুন যে অ-অবিচল পছন্দগুলি এই সিস্টেমটি ব্যবহার করে আপডেট হবে না। তাদের setOnPreferenceChangeListener(Preference.OnPreferenceChangeListener onPreferenceChangeListener)পছন্দগুলি পৃথক পছন্দসমূহের-আদর্শ ব্যবহার করে শুনতে হবে ।
আসমো সোইনিও

11

প্রকৃতপক্ষে, চেকবক্সপ্রিফারেন্সটিতে চেকবক্সের মানের উপর ভিত্তি করে একটি আলাদা সংক্ষিপ্তসার নির্দিষ্ট করার ক্ষমতা রয়েছে। অ্যান্ড্রয়েড দেখুন: সারাংশঅফ এবং অ্যান্ড্রয়েড: সংক্ষিপ্ত বিবরণে (পাশাপাশি সংশ্লিষ্ট চেকবক্সপ্রিফারেন্স পদ্ধতিগুলি)।


11

এডিটেক্সট প্রেফারেন্সের জন্য:

public class MyEditTextPreference extends EditTextPreference {
    public MyEditTextPreference(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public MyEditTextPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setText(String text) {
        super.setText(text);
        setSummary(text);
    }
}

9

যদি কেউ এখনও এর উত্তর খুঁজছেন তবে আপনার ত্রিশতম উত্তর উত্তরের পরীক্ষা করা উচিত ।

<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 কে বর্তমানের পছন্দসই স্ট্রিং মানের সাথে প্রতিস্থাপন করবে, যেমন তালিকাপ্রিফারেন্সের চয়নকারী দ্বারা প্রদর্শিত হবে।


কাজ করে। এটি আজকের সবচেয়ে সহজ এবং সর্বোত্তম সমাধান।
ডেভিডজৌং

1
নোট করুন যে "% s" আপনার সারসংক্ষেপ স্ট্রিংয়ের যে কোনও জায়গায় রাখা যেতে পারে। এবং হ্যাঁ, এর মধ্যে রয়েছে রিসোর্স স্ট্রিং!
স্কট বিগস

7

এই টিপ জন্য ধন্যবাদ!

আমার একটি পছন্দ পর্দা রয়েছে এবং প্রতিটি তালিকার পছন্দ হিসাবে সংক্ষিপ্তসার হিসাবে মানটি দেখতে চাই।

এটি এখন আমার উপায়:

public class Preferences extends PreferenceActivity implements OnSharedPreferenceChangeListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
}

@Override
protected void onResume() {
    super.onResume();

    // Set up initial values for all list preferences
    Map<String, ?> sharedPreferencesMap = getPreferenceScreen().getSharedPreferences().getAll();
    Preference pref;
    ListPreference listPref;
    for (Map.Entry<String, ?> entry : sharedPreferencesMap.entrySet()) {
        pref = findPreference(entry.getKey());
        if (pref instanceof ListPreference) {
            listPref = (ListPreference) pref;
            pref.setSummary(listPref.getEntry());
        }
    }

    // Set up a listener whenever a key changes            
    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

@Override
protected void onPause() {
    super.onPause();

    // Unregister the listener whenever a key changes            
    getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);    
}

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    Preference pref = findPreference(key);

    if (pref instanceof ListPreference) {
        ListPreference listPref = (ListPreference) pref;
        pref.setSummary(listPref.getEntry());
    }
}

এটি আমার পক্ষে কাজ করে তবে আমি ভাবছি যে সর্বোত্তম সমাধানটি (পারফরম্যান্স, স্থিতিশীলতা, স্কেলিবিলিটি) কোনটি: কোয়েম দেখিয়ে দিচ্ছে বা এইটি?


6

ধন্যবাদ, রেটো, বিস্তারিত ব্যাখ্যার জন্য!

এটি কারওর পক্ষে যদি সহায়তা করে তবে অ্যান্ড্রয়েড 1.5 এর জন্য এসডিকে দিয়ে কাজ করার জন্য আমাকে রেটো মেয়ারের প্রস্তাবিত কোডটি পরিবর্তন করতে হয়েছিল

@Override
protected void onResume() {
    super.onResume();

    // Setup the initial values
    mListPreference.setSummary("Current value is " + mListPreference.getEntry().toString()); 

    // Set up a listener whenever a key changes            
    ...
}

একই পরিবর্তন কলব্যাক ফাংশনের জন্য প্রযোজ্য onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)

চিয়ার্স,

ক্রিস


4

আমি তালিকাটির নীচের বংশধরদের সাথে সমস্যাটি সমাধান করেছি:

public class EnumPreference extends ListPreference {

    public EnumPreference(Context aContext, AttributeSet attrs) {
        super(aContext,attrs);
    }

    @Override
    protected View onCreateView(ViewGroup parent) {
        setSummary(getEntry());
        return super.onCreateView(parent);
    }

    @Override
    protected boolean persistString(String aNewValue) {
        if (super.persistString(aNewValue)) {
            setSummary(getEntry());
            notifyChanged();
            return true;
        } else {
            return false;
        }
    }
}

4.0.4.4 এর মধ্যে 1.6 পর্যন্ত আমার জন্য দুর্দান্ত কাজ করেছে বলে মনে হচ্ছে।


4
public class ProfileManagement extends PreferenceActivity implements
OnPreferenceChangeListener {
    EditTextPreference screenName;
    ListPreference sex;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.layout.profile_management);

            screenName = (EditTextPreference) findPreference("editTextPref");
            sex = (ListPreference) findPreference("sexSelector");

            screenName.setOnPreferenceChangeListener(this);
            sex.setOnPreferenceChangeListener(this);

    }   

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        preference.setSummary(newValue.toString());
        return true;
    }
}

4

আমি সমস্ত ভোট দেওয়া উত্তরগুলি দেখেছি যে সঠিক বর্তমান মানটির সাথে সংক্ষিপ্তসারটি কীভাবে সেট করা যায় তা দেখায়, তবে ওপিও এর মতো কিছু চাইছিল:

" X দিন পরে বার্তাগুলি পরিষ্কার করুন " * <- সারাংশ যেখানে এক্স বর্তমান পছন্দসই মান

এটি অর্জনের জন্য আমার উত্তর এখানে

ডকুমেন্টেশন যেমন বলে ListPreference.getSummary():

এই তালিকাপ্রিফারেন্সির সংক্ষিপ্তসারটি দেয়। যদি সংক্ষিপ্তসারটিতে একটি স্ট্রিং ফর্ম্যাটিং মার্কার থাকে (যেমন "% s" বা "% 1 $ s"), তবে বর্তমান প্রবেশ মূল্যটি তার জায়গায় প্রতিস্থাপিত হবে।

তবে, আমি বেশ কয়েকটি ডিভাইসে চেষ্টা করেছি এবং দেখে মনে হচ্ছে এটি কার্যকর হয় না। কিছু গবেষণা করে আমি এই উত্তরে একটি ভাল সমাধান পেয়েছি । এটি সহজেই অ্যান্ড্রয়েড ডকুমেন্টেশন দ্বারা নির্দিষ্ট হিসাবে কাজ করতে Preferenceআপনার ব্যবহৃত প্রতিটি প্রসারিত এবং ওভাররাইড নিয়ে গঠিত getSummary()


1
এটি প্রাথমিকভাবে কাজ করছে বলে মনে হয়, তবে আপনি যখন একটি নতুন মান চয়ন করেন তখন পুরো কার্যক্রমটিকে অকার্যকর করার জন্য এবং এটি পুনরায় চিত্রায়িত করার কারণ না করা পর্যন্ত এটি স্বয়ংক্রিয়ভাবে আপডেট হয় না। আমি অ্যান্ড্রয়েড 4.0.4 এ আছি on
আইডলন

গুগল যদি পছন্দসই বস্তুটিতে একটি বিন্যাসের স্ট্রিং যুক্ত করতে পারে তবে তা খুব ভাল।
জাস্টিন স্মিথ

3

যদি আপনি কেবল প্রতিটি ক্ষেত্রের সরল পাঠ্য মানটিকে তার সারাংশ হিসাবে প্রদর্শন করতে চান তবে নিম্নলিখিত কোডটি বজায় রাখা সবচেয়ে সহজ হওয়া উচিত। এর জন্য কেবলমাত্র দুটি পরিবর্তন প্রয়োজন (13 এবং 21 লাইন, "এখানে পরিবর্তন" দিয়ে চিহ্নিত):

package com.my.package;

import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;

public class PreferencesActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {

    private final String[] mAutoSummaryFields = { "pref_key1", "pref_key2", "pref_key3" }; // change here
    private final int mEntryCount = mAutoSummaryFields.length;
    private Preference[] mPreferenceEntries;

    @SuppressWarnings("deprecation")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences_file); // change here
        mPreferenceEntries = new Preference[mEntryCount];
        for (int i = 0; i < mEntryCount; i++) {
            mPreferenceEntries[i] = getPreferenceScreen().findPreference(mAutoSummaryFields[i]);
        }
    }

    @SuppressWarnings("deprecation")
    @Override
    protected void onResume() {
        super.onResume();
        for (int i = 0; i < mEntryCount; i++) {
            updateSummary(mAutoSummaryFields[i]); // initialization
        }
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); // register change listener
    }

    @SuppressWarnings("deprecation")
    @Override
    protected void onPause() {
        super.onPause();
        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); // unregister change listener
    }

    private void updateSummary(String key) {
        for (int i = 0; i < mEntryCount; i++) {
            if (key.equals(mAutoSummaryFields[i])) {
                if (mPreferenceEntries[i] instanceof EditTextPreference) {
                    final EditTextPreference currentPreference = (EditTextPreference) mPreferenceEntries[i];
                    mPreferenceEntries[i].setSummary(currentPreference.getText());
                }
                else if (mPreferenceEntries[i] instanceof ListPreference) {
                    final ListPreference currentPreference = (ListPreference) mPreferenceEntries[i];
                    mPreferenceEntries[i].setSummary(currentPreference.getEntry());
                }
                break;
            }
        }
    }

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        updateSummary(key);
    }

}

3

এখানে আমার সমাধান:

একটি পছন্দ টাইপ 'গেটর' পদ্ধতি তৈরি করুন।

protected String getPreference(Preference x) {
    // http://stackoverflow.com/questions/3993982/how-to-check-type-of-variable-in-java
    if (x instanceof CheckBoxPreference)
        return "CheckBoxPreference";
    else if (x instanceof EditTextPreference)
        return "EditTextPreference";
    else if (x instanceof ListPreference)
        return "ListPreference";
    else if (x instanceof MultiSelectListPreference)
        return "MultiSelectListPreference";
    else if (x instanceof RingtonePreference)
        return "RingtonePreference";
    else if (x instanceof SwitchPreference)
        return "SwitchPreference";
    else if (x instanceof TwoStatePreference)
        return "TwoStatePreference";
    else if (x instanceof DialogPreference) // Needs to be after ListPreference
        return "DialogPreference";
    else
        return "undefined";
}

একটি 'setSummaryInit' পদ্ধতি তৈরি করুন।

public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
        Log.i(TAG, "+ onSharedPreferenceChanged(prefs:" + prefs + ", key:" + key + ")");
        if( key != null ) {
            updatePreference(prefs, key);
            setSummary(key);
        } else {
            Log.e(TAG, "Preference without key!");
        }
        Log.i(TAG, "- onSharedPreferenceChanged()");
    }

    protected boolean setSummary() {
        return _setSummary(null);
    }

    protected boolean setSummary(String sKey) {
        return _setSummary(sKey);
    }

    private boolean _setSummary(String sKey) {
        if (sKey == null) Log.i(TAG, "Initializing");
        else Log.i(TAG, sKey);

        // Get Preferences
        SharedPreferences sharedPrefs = PreferenceManager
                .getDefaultSharedPreferences(this);

        // Iterate through all Shared Preferences
        // http://stackoverflow.com/questions/9310479/how-to-iterate-through-all-keys-of-shared-preferences
        Map<String, ?> keys = sharedPrefs.getAll();
        for (Map.Entry<String, ?> entry : keys.entrySet()) {
            String key = entry.getKey();
            // Do work only if initializing (null) or updating specific preference key
            if ( (sKey == null) || (sKey.equals(key)) ) {
                String value = entry.getValue().toString();
                Preference pref = findPreference(key);
                String preference = getPreference(pref);
                Log.d("map values", key + " | " + value + " | " + preference);
                pref.setSummary(key + " | " + value + " | " + preference);
                if (sKey != null) return true;
            }
        }
        return false;
    }

    private void updatePreference(SharedPreferences prefs, String key) {
        Log.i(TAG, "+ updatePreference(prefs:" + prefs + ", key:" + key + ")");
        Preference pref = findPreference(key);
        String preferenceType = getPreference(pref);
        Log.i(TAG, "preferenceType = " + preferenceType);
        Log.i(TAG, "- updatePreference()");
    }

আরম্ভ

এমন সর্বজনীন শ্রেণী তৈরি করুন যা পছন্দসইটিভিটি এবং OnSharedPreferencesChangeListener প্রয়োগ করে

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    PreferenceManager.setDefaultValues(this, R.xml.global_preferences,
    false);
    this.addPreferencesFromResource(R.xml.global_preferences);
    this.getPreferenceScreen().getSharedPreferences()
        .registerOnSharedPreferenceChangeListener(this);
}

protected void onResume() {
    super.onResume();
    setSummary();
}


3

অবগতির জন্য:

findPreference(CharSequence key)
This method was deprecated in API level 11. This function is not relevant
for a modern fragment-based PreferenceActivity.

সকল খুব বাক্পটুতাপূর্ণ তাকান আরও একটি কারণ Answer(উপরে @ASD এর উৎস এখানে পাওয়া ) ব্যবহার করতে বলার অপেক্ষা রাখে না %sযে android:summaryপ্রতিটি ক্ষেত্রের জন্য preferences.xml। (বর্তমানের পছন্দের মানটি পরিবর্তিত হয় %s।)

এখানে চিত্র বর্ণনা লিখুন

<ListPreference
 ...        
 android:summary="Length of longest word to return as match is %s"
 ...
 />

3

যেহেতু অ্যান্ড্রয়েডএক্স পছন্দের শ্রেণিতে সংক্ষিপ্তপ্রভাইডার ইন্টারফেস রয়েছে, তাই এটি অন্যাশার্ডপ্রিফারেন্সেনচার্জলিস্টনার ছাড়াই করা যায়। EditTextPreferences এবং listPreferences জন্য সহজ বাস্তবায়ন সরবরাহ করা হয়। উপর নির্মাণের EddieB এর উত্তর এটা ভালো সন্ধান করতে পারেন। Androidx.preferences: পছন্দ: 1.1.0-alpha03 এ পরীক্ষিত।

package com.example.util.timereminder.ui.prefs;

import android.os.Bundle;

import com.example.util.timereminder.R;

import androidx.preference.EditTextPreference;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceGroup;

/**
 * Displays different preferences.
 */
public class PrefsFragmentExample extends PreferenceFragmentCompat {

    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        addPreferencesFromResource(R.xml.preferences);

        initSummary(getPreferenceScreen());
    }

    /**
     * Walks through all preferences.
     *
     * @param p The starting preference to search from.
     */
    private void initSummary(Preference p) {
        if (p instanceof PreferenceGroup) {
            PreferenceGroup pGrp = (PreferenceGroup) p;
            for (int i = 0; i < pGrp.getPreferenceCount(); i++) {
                initSummary(pGrp.getPreference(i));
            }
        } else {
            setPreferenceSummary(p);
        }
    }

    /**
     * Sets up summary providers for the preferences.
     *
     * @param p The preference to set up summary provider.
     */
    private void setPreferenceSummary(Preference p) {
        // No need to set up preference summaries for checkbox preferences because
        // they can be set up in xml using summaryOff and summary On
        if (p instanceof ListPreference) {
            p.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance());
        } else if (p instanceof EditTextPreference) {
            p.setSummaryProvider(EditTextPreference.SimpleSummaryProvider.getInstance());
        }
    }
}

2

এখানে, এগুলি সমস্তই গ্রহনের নমুনা থেকে কাটা হয়েছে SettingsActivity । এই অ্যান্ড্রয়েড বিকাশকারীরা কীভাবে আরও সাধারণীকরণ এবং স্থিতিশীল কোডিং শৈলীর জন্য নিখুঁত চয়ন করেন তা দেখানোর জন্য আমাকে এই সমস্ত খুব বেশি কোড অনুলিপি করতে হবে।

আমি PreferenceActivityট্যাবলেট এবং বৃহত্তর এপিআই মানিয়ে নেওয়ার জন্য কোডগুলি রেখেছি ।

public class SettingsActivity extends PreferenceActivity {

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);

    setupSummaryUpdatablePreferencesScreen();
}

private void setupSummaryUpdatablePreferencesScreen() {

    // In the simplified UI, fragments are not used at all and we instead
    // use the older PreferenceActivity APIs.

    // Add 'general' preferences.
    addPreferencesFromResource(R.xml.pref_general);

    // Bind the summaries of EditText/List/Dialog preferences to
    // their values. When their values change, their summaries are updated
    // to reflect the new value, per the Android Design guidelines.
    bindPreferenceSummaryToValue(findPreference("example_text"));
    bindPreferenceSummaryToValue(findPreference("example_list"));
}

/**
 * A preference value change listener that updates the preference's summary
 * to reflect its new value.
 */
private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {

    private String TAG = SettingsActivity.class.getSimpleName();

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

        if (preference instanceof ListPreference) {
            // For list preferences, look up the correct display value in
            // the preference's 'entries' list.
            ListPreference listPreference = (ListPreference) preference;
            int index = listPreference.findIndexOfValue(stringValue);

            // Set the summary to reflect the new value.
            preference.setSummary(
                index >= 0
                ? listPreference.getEntries()[index]
                : null);
        } else {
            // For all other preferences, set the summary to the value's
            // simple string representation.
            preference.setSummary(stringValue);
        }
        Log.i(TAG, "pref changed : " + preference.getKey() + " " + value);
        return true;
    }
};

/**
 * Binds a preference's summary to its value. More specifically, when the
 * preference's value is changed, its summary (line of text below the
 * preference title) is updated to reflect the value. The summary is also
 * immediately updated upon calling this method. The exact display format is
 * dependent on the type of preference.
 *
 * @see #sBindPreferenceSummaryToValueListener
 */

private static void bindPreferenceSummaryToValue(Preference preference) {
    // Set the listener to watch for value changes.
    preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);

    // Trigger the listener immediately with the preference's
    // current value.
    sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
                                                             PreferenceManager
                                                             .getDefaultSharedPreferences(preference.getContext())
                                                             .getString(preference.getKey(), ""));
}

}

xml/pref_general.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

<!-- NOTE: EditTextPreference accepts EditText attributes. -->
<!-- NOTE: EditTextPreference's summary should be set to its value by the activity code. -->
<EditTextPreference
android:capitalize="words"
android:defaultValue="@string/pref_default_display_name"
android:inputType="textCapWords"
android:key="example_text"
android:maxLines="1"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="@string/pref_title_display_name" />

<!-- NOTE: Hide buttons to simplify the UI. Users can touch outside the dialog todismiss it.-->
<!-- NOTE: ListPreference's summary should be set to its value by the activity code. -->
<ListPreference
android:defaultValue="-1"
android:entries="@array/pref_example_list_titles"
android:entryValues="@array/pref_example_list_values"
android:key="example_list"
android:negativeButtonText="@null"
android:positiveButtonText="@null"
android:title="@string/pref_title_add_friends_to_messages" />

</PreferenceScreen>

values/strings_activity_settings.xml

<resources>
<!-- Strings related to Settings -->

<!-- Example General settings -->

<string name="pref_title_display_name">Display name</string>
<string name="pref_default_display_name">John Smith</string>

<string name="pref_title_add_friends_to_messages">Add friends to messages</string>
<string-array name="pref_example_list_titles">
<item>Always</item>
<item>When possible</item>
<item>Never</item>
</string-array>
<string-array name="pref_example_list_values">
<item>1</item>
<item>0</item>
<item>-1</item>
</string-array>
</resources>

বিঃদ্রঃ: আসলে আমি "পছন্দসইটির জন্য গুগলের নমুনাটিও আকর্ষণীয়" এর মত মন্তব্য করতে চাই। তবে আমার যথেষ্ট খ্যাতি পয়েন্ট নেই have সুতরাং দয়া করে আমাকে দোষ দেবেন না।

(খারাপ ইংরেজির জন্য দুঃখিত)


2

আপনাকে onCreate পদ্ধতিতে bindPreferencesSumaryToValue ফাংশন ব্যবহার করতে হবে।

উদাহরণ:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Add 'general' preferences, defined in the XML file
        addPreferencesFromResource(R.xml.pref_general);

        // For all preferences, attach an OnPreferenceChangeListener so the UI summary can be
        // updated when the preference changes.
        bindPreferenceSummaryToValue(findPreference(getString(R.string.pref_location_key)));
        bindPreferenceSummaryToValue(findPreference(getString(R.string.pref_units_key)));
    }

উদাসিটি অ্যান্ড্রয়েড কোর্সে পাঠ 3 দেখুন: https://www.udacity.com/course/viewer#!/c-ud853/l-1474559101/e-1643578599/m-1643578601


2

জন্য EditTextPreference :

আমি অবশ্যই এই সমাধানটিতে এসেছি, কেবল যদি আপনার নির্দিষ্ট সম্পাদনাভাষার প্রয়োজন হয় তবে আপনি প্রতিটি পছন্দ সহ এটি করতে পারেন:

............

private static final String KEY_EDIT_TEXT_PREFERENCE2 = "on_a1";
public static  String value = "";

............

private void updatePreference(Preference preference, String key) {

            if (key.equals(KEY_EDIT_TEXT_PREFERENCE2)) {
                preference = findPreference(key);
                if (preference instanceof EditTextPreference) {
                    editTextPreference = (EditTextPreference) preference;
                    editTextPreference.setSummary(editTextPreference.getText());
                    value = editTextPreference.getText().toString();
                    return;
                }
                SharedPreferences sharedPrefs = getPreferenceManager().getSharedPreferences();
                preference.setSummary(sharedPrefs.getString(KEY_EDIT_TEXT_PREFERENCE2, ""));

            }
}

তারপরে onResume () এ;

@Override
        public void onResume() {
            super.onResume();

            SharedPreferences etext = getPreferenceManager().getSharedPreferences();
            String str = etext.getString("value", "");
            editTextPreference = (EditTextPreference) findPreference(KEY_EDIT_TEXT_PREFERENCE2);
            editTextPreference.setText(str);
            editTextPreference.setSummary(editTextPreference.getText());

            getPreferenceScreen().getSharedPreferences()
                    .registerOnSharedPreferenceChangeListener(this);
        }

ভিতরে:

@Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
            updatePreference(findPreference(key), key);
}

2

আমার সমাধানটি হ'ল একটি কাস্টম তৈরি করা EditTextPreference, এটি এক্সএমএলে ব্যবহৃত:<com.example.EditTextPreference android:title="Example Title" />

সম্পাদনা পাঠ্য প্রিফারেন্স.জভা : -

package com.example;

import android.content.Context;
import android.util.AttributeSet;

public class EditTextPreference extends android.preference.EditTextPreference
{
    public EditTextPreference(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }

    public EditTextPreference(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public EditTextPreference(Context context)
    {
        super(context, null);
    }

    @Override
    protected void onDialogClosed(boolean positiveResult)
    {
        super.onDialogClosed(positiveResult);

        setSummary(getSummary());
    }

    @Override
    public CharSequence getSummary()
    {
        return getText();
    }
}


1

ListPreferenceএকটি সংলাপে নির্বাচিত মানটির সংক্ষিপ্তসারটি সেট করতে আপনি এই কোডটি ব্যবহার করতে পারেন:

package yourpackage;

import android.content.Context;
import android.util.AttributeSet;

public class ListPreference extends android.preference.ListPreference {

    public ListPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    protected void onDialogClosed(boolean positiveResult) {
        super.onDialogClosed(positiveResult);
        if (positiveResult) setSummary(getEntry());
    }

    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
        super.onSetInitialValue(restoreValue, defaultValue);
        setSummary(getEntry());
    }
}

এবং yourpackage.ListPreferenceআপনার preferences.xmlস্মরণে থাকা অবজেক্টটিকে এখানে উল্লেখ করার জন্য রেফারেন্স করুন android:defaultValueকারণ এটি কলটি ট্রিগার করে onSetInitialValue()

আপনি যদি চান তবে আপনি setSummary()আপনার অ্যাপ্লিকেশনটির উপযুক্ত বলে কল করার আগে পাঠ্যটি সংশোধন করতে পারেন ।


1

যেহেতু আমি একটি কাস্টম ব্যবহার করছি PreferenceDataStore, আমি SharedPreferenceকারওর সাথে শ্রোতা যুক্ত করতে পারছি না তাই আমাকে কিছুটা হ্যাকি সমাধান লিখতে হবে যা প্রতিটি পছন্দ শুনে:

class SettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChangeListener {
    private val handler: Handler by lazy { Handler(Looper.getMainLooper()) }

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        preferenceManager.preferenceDataStore = prefs
        addPreferencesFromResource(R.xml.app_preferences)
        onPreferenceChange(preferenceScreen, null)
    }

    override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean {
        preference.onPreferenceChangeListener = this

        when (preference) {
            is PreferenceGroup -> for (i in 0 until preference.preferenceCount) {
                onPreferenceChange(preference.getPreference(i), null)
            }
            is ListPreference -> {
                if (preference.value == null) {
                    preference.isPersistent = false
                    preference.value = Preference::class.java.getDeclaredField("mDefaultValue")
                            .apply { isAccessible = true }
                            .get(preference).toString()
                    preference.isPersistent = true
                }

                postPreferenceUpdate(Runnable { preference.summary = preference.entry })
            }
        }
        return true
    }

    /**
     * We can't directly update the preference summary update because [onPreferenceChange]'s result
     * is used to decide whether or not to update the pref value.
     */
    private fun postPreferenceUpdate(r: Runnable) = handler.post(r)
}

1

আপনি যদি অ্যান্ড্রয়েডএক্স ব্যবহার করেন তবে আপনি একটি কাস্টম ব্যবহারSummaryProvider করতে পারেন । এই পদ্ধতির যে কোনও জন্য ব্যবহার করা যেতে পারেPreference

ডকুমেন্টেশন (জাভা) থেকে উদাহরণ:

EditTextPreference countingPreference = (EditTextPreference) findPreference("counting");

countingPreference.setSummaryProvider(new SummaryProvider<EditTextPreference>() {
    @Override
    public CharSequence provideSummary(EditTextPreference preference) {
        String text = preference.getText();
        if (TextUtils.isEmpty(text)){
            return "Not set";
        }
        return "Length of saved value: " + text.length();
    }
});

ডকুমেন্টেশন থেকে উদাহরণ (কোটলিন):

val countingPreference = findPreference("counting") as EditTextPreference

countingPreference.summaryProvider = SummaryProvider<EditTextPreference> { preference ->
    val text = preference.text
    if (TextUtils.isEmpty(text)) {
        "Not set"
    } else {
        "Length of saved value: " + text.length
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.