Android Jetpack এর অংশ সংরক্ষিত পছন্দ মান ব্যবহার করুন।

এই নথিটি বর্ণনা করে যে কীভাবে Preference মানগুলি সংরক্ষণ এবং ব্যবহার করতে হয় যা পছন্দ গ্রন্থাগার দ্বারা সংরক্ষিত হয়।

পছন্দ ডেটা স্টোরেজ

এই বিভাগটি বর্ণনা করে যে কীভাবে একটি Preference ডেটা বজায় রাখতে পারে।

ভাগ করা পছন্দসমূহ

ডিফল্টরূপে, একটি Preference মান সংরক্ষণ করতে SharedPreferences ব্যবহার করে। SharedPreferences API একটি ফাইল থেকে সহজ কী-মান জোড়া পড়া এবং লেখা সমর্থন করে যা অ্যাপ্লিকেশন সেশন জুড়ে সংরক্ষিত হয়। পছন্দ লাইব্রেরি একটি ব্যক্তিগত SharedPreferences উদাহরণ ব্যবহার করে যাতে শুধুমাত্র আপনার অ্যাপ্লিকেশন এটি অ্যাক্সেস করতে পারে।

একটি উদাহরণ হিসাবে, নিম্নলিখিত SwitchPreferenceCompat অনুমান করুন:

<SwitchPreferenceCompat
        app:key="notifications"
        app:title="Enable message notifications"/>

যখন একজন ব্যবহারকারী এই সুইচটিকে "চালু" অবস্থায় টগল করেন, SharedPreferences ফাইলটি "notifications" : "true" এর একটি কী-মানের জোড়ার সাথে আপডেট হয়। ব্যবহৃত কীটি Preference জন্য সেট করা কীটির মতোই।

SharedPreferences API সম্পর্কে আরও তথ্যের জন্য, কী-মান ডেটা সংরক্ষণ করুন দেখুন।

অ্যান্ড্রয়েডে ডেটা সংরক্ষণের বিভিন্ন উপায় সম্পর্কে তথ্যের জন্য, ডেটা এবং ফাইল স্টোরেজ ওভারভিউ দেখুন।

পছন্দ ডেটাস্টোর

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

একটি PreferenceDataStore আপনাকে Preference মান বজায় রাখতে একটি কাস্টম স্টোরেজ ব্যাকএন্ড ব্যবহার করতে দেয়। আরও তথ্যের জন্য, একটি কাস্টম ডেটাস্টোর ব্যবহার করুন দেখুন।

পছন্দের মান পড়ুন

ব্যবহার করা হচ্ছে SharedPreferences অবজেক্ট পুনরুদ্ধার করতে, PreferenceManager.getDefaultSharedPreferences() কল করুন। যদিও এই পদ্ধতিটি আপনার অ্যাপ্লিকেশানের যেকোন জায়গা থেকে কাজ করে, আমরা আপনাকে আপনার অ্যাপকে স্তরগুলিতে বিভক্ত করার পরামর্শ দিই৷ আরও তথ্যের জন্য, ডেটা স্তর দেখুন।

উদাহরণস্বরূপ, "signature" এর একটি কী সহ একটি EditTextPreference দেওয়া হয়েছে, নিম্নরূপ:

<EditTextPreference
        app:key="signature"
        app:title="Your signature"/>

আপনি বিশ্বব্যাপী এই Preference জন্য সংরক্ষিত মান পুনরুদ্ধার করতে পারেন, নিম্নরূপ:

কোটলিন

val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this /* Activity context */)
val name = sharedPreferences.getString("signature", "")

জাভা

SharedPreferences sharedPreferences =
        PreferenceManager.getDefaultSharedPreferences(this /* Activity context */);
String name = sharedPreferences.getString("signature", "");

পছন্দ মান পরিবর্তনের জন্য শুনুন

Preference মানগুলির পরিবর্তনগুলি শুনতে, আপনি দুটি ইন্টারফেসের মধ্যে বেছে নিতে পারেন:

নিম্নলিখিত সারণী দেখায় কিভাবে দুটি ইন্টারফেস পৃথক:

OnPreferenceChangeListener OnSharedPreferenceChangeListener
একটি একক Preference উপর সেট করুন। সমস্ত Preference বস্তুর জন্য প্রযোজ্য।
বলা হয় যখন একটি Preference তার সংরক্ষিত মান পরিবর্তন করতে চলেছে, এমনকি যদি মুলতুবি থাকা মানটি সংরক্ষিত মানের সমান হয়। একটি Preference জন্য সংরক্ষিত মান পরিবর্তন হলে শুধুমাত্র কল করা হয়।
শুধুমাত্র Preference লাইব্রেরির মাধ্যমে কল করা হয়। অ্যাপ্লিকেশনটির একটি পৃথক অংশ সংরক্ষিত মান পরিবর্তন করতে পারে। যখনই সংরক্ষিত মান পরিবর্তিত হয় তখন কল করা হয়, এমনকি এটি অ্যাপ্লিকেশনের একটি পৃথক অংশ থেকে হলেও।
মুলতুবি থাকা মান সংরক্ষণ করার আগে কল করা হয়। মান সংরক্ষণ করার পরে কল করা হয়।
SharedPreferences বা একটি PreferenceDataStore ব্যবহার করার সময় কল করা হয়। SharedPreferences ব্যবহার করার সময় শুধুমাত্র কল করা হয়।

OnPreferenceChangeListener প্রয়োগ করুন

একটি OnPreferenceChangeListener প্রয়োগ করার ফলে আপনি একটি Preference মানের একটি মুলতুবি পরিবর্তন শুনতে পারবেন। তারপরে, আপনি পরিবর্তনটি ঘটবে কিনা তা যাচাই করতে পারেন। উদাহরণ স্বরূপ, নিম্নলিখিত কোডটি দেখায় কিভাবে একটি EditTextPreference এর মান পরিবর্তনের জন্য "name" -এর একটি কী দিয়ে শুনতে হয়:

কোটলিন

override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean {
    Log.e("preference", "Pending Preference value is: $newValue")
    return true
}

জাভা

@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
    Log.e("preference", "Pending Preference value is: " + newValue);
    return true;
}

এর পরে, আপনাকে এই শ্রোতাকে সরাসরি setOnPreferenceChangeListener() দিয়ে সেট করতে হবে, নিম্নরূপ:

কোটলিন

preference.onPreferenceChangeListener = ...

জাভা

preference.setOnPreferenceChangeListener(...);

OnSharedPreferenceChangeListener প্রয়োগ করুন

SharedPreferences ব্যবহার করে Preference মান বজায় রাখার সময়, আপনি পরিবর্তনের জন্য একটি SharedPreferences.OnSharedPreferenceChangeListener ব্যবহার করতে পারেন। এটি আপনাকে শুনতে দেয় যখন আপনার Preference দ্বারা সংরক্ষিত মানগুলি পরিবর্তন করা হয়, যেমন একটি সার্ভারের সাথে সেটিংস সিঙ্ক করার সময়। নিচের উদাহরণটি দেখায় কিভাবে একটি EditTextPreference এর মান পরিবর্তনের জন্য "name" -এর একটি কী দিয়ে শুনতে হয়:

কোটলিন

override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
    if (key == "signature") {
        Log.i(TAG, "Preference value was updated to: " + sharedPreferences.getString(key, ""))
    }
}

জাভা

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    if (key.equals("signature")) {
        Log.i(TAG, "Preference value was updated to: " + sharedPreferences.getString(key, ""));
    }
}

registerOnSharedPreferenceChangedListener() ব্যবহার করে শ্রোতা নিবন্ধন করুন, নিম্নরূপ:

কোটলিন

preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(...)

জাভা

getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(...);

কোটলিন

    val listener: SharedPreferences.OnSharedPreferenceChangeListener =
            SharedPreferences.OnSharedPreferenceChangeListener {...}
    

জাভা

    SharedPreferences.OnSharedPreferenceChangeListener listener =
            new SharedPreferences.OnSharedPreferenceChangeListener() {...}
    

আপনার Activity বা Fragment সঠিক লাইফসাইকেল ম্যানেজমেন্টের জন্য, এই শ্রোতাকে onResume() এবং onPause() কলব্যাকে নিবন্ধন করুন এবং আন-রেজিস্টার করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

override fun onResume() {
    super.onResume()
    preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(this)
}

override fun onPause() {
    super.onPause()
    preferenceManager.sharedPreferences.unregisterOnSharedPreferenceChangeListener(this)
}

জাভা

@Override
public void onResume() {
    super.onResume();
    getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onPause() {
    super.onPause();
    getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}

একটি কাস্টম ডেটাস্টোর ব্যবহার করুন

যদিও আমরা SharedPreferences ব্যবহার করে Preference অবজেক্ট টিকে থাকার পরামর্শ দিই, আপনি একটি কাস্টম ডেটাস্টোরও ব্যবহার করতে পারেন। একটি কাস্টম ডেটাস্টোর উপযোগী হতে পারে যদি আপনার অ্যাপ্লিকেশনটি একটি ডাটাবেসের মান বজায় রাখে বা মানগুলি ডিভাইস-নির্দিষ্ট হয়, যেমনটি নিম্নলিখিত উদাহরণগুলিতে দেখানো হয়েছে।

ডেটাস্টোর বাস্তবায়ন করুন

একটি কাস্টম ডেটাস্টোর বাস্তবায়ন করতে, একটি ক্লাস তৈরি করুন যা PreferenceDataStore প্রসারিত করে। নিম্নলিখিত উদাহরণটি একটি ডেটাস্টোর তৈরি করে যা String মানগুলি পরিচালনা করে:

কোটলিন

class DataStore : PreferenceDataStore() {
    override fun putString(key: String, value: String?) {
        // Save the value somewhere.
    }

    override fun getString(key: String, defValue: String?): String? {
        // Retrieve the value.
    }
}

জাভা

public class DataStore extends PreferenceDataStore {
    @Override
    public void putString(String key, @Nullable String value) {
        // Save the value somewhere.
    }
    @Override
    @Nullable
    public String getString(String key, @Nullable String defValue) {
        // Retrieve the value.
    }
}

ইউজার ইন্টারফেস ব্লক করা এড়াতে মূল থ্রেড থেকে যেকোন সময় সাপেক্ষ অপারেশন চালান। যেহেতু একটি মান বজায় রাখার সময় ডেটাস্টোর ধারণকারী Fragment বা Activity ধ্বংস করা সম্ভব, তাই ডেটাটিকে সিরিয়ালাইজ করুন যাতে আপনি ব্যবহারকারীর দ্বারা পরিবর্তিত কোনো মান হারাবেন না।

ডেটাস্টোর সক্রিয় করুন

আপনি আপনার ডেটাস্টোর বাস্তবায়ন করার পরে, নতুন ডেটাস্টোর onCreatePreferences() সেট করুন যাতে Preference বস্তুগুলি ডিফল্ট SharedPreferences ব্যবহার করার পরিবর্তে ডেটাস্টোরের সাথে মান বজায় রাখে। আপনি প্রতিটি Preference বা সমগ্র অনুক্রমের জন্য একটি ডেটাস্টোর সক্ষম করতে পারেন।

একটি নির্দিষ্ট Preference জন্য একটি কাস্টম ডেটাস্টোর সক্ষম করতে, Preference উপর setPreferenceDataStore() কল করুন, নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

val preference: Preference? = findPreference("key")
preference?.preferenceDataStore = dataStore

জাভা

Preference preference = findPreference("key");
if (preference != null) {
    preference.setPreferenceDataStore(dataStore);
}

একটি সম্পূর্ণ অনুক্রমের জন্য একটি কাস্টম ডেটাস্টোর সক্ষম করতে, PreferenceManagersetPreferenceDataStore() এ কল করুন:

কোটলিন

val preferenceManager = preferenceManager
preferenceManager.preferenceDataStore = dataStore

জাভা

PreferenceManager preferenceManager = getPreferenceManager();
preferenceManager.setPreferenceDataStore(dataStore);

একটি নির্দিষ্ট Preference জন্য সেট করা একটি ডেটাস্টোর সংশ্লিষ্ট শ্রেণিবিন্যাসের জন্য সেট করা যেকোনো ডেটাস্টোরকে ওভাররাইড করে। বেশিরভাগ ক্ষেত্রে, আপনি পুরো অনুক্রমের জন্য একটি ডেটাস্টোর সেট করেন।