استخدام قيم "الإعدادات المفضّلة" المحفوظة جزء من Android Jetpack.

توضح هذه الوثيقة كيفية تخزين واستخدام قيم Preference المحفوظة من خلال مكتبة التفضيلات.

تخزين البيانات كتفضيل

يوضّح هذا القسم كيفية احتفاظ Preference بالبيانات.

الإعدادات المفضّلة المشتركة

بشكل تلقائي، يستخدم Preference وفِّر SharedPreferences القيم. SharedPreferences API تتيح قراءة النصوص وكتابتها بسهولة أزواج المفتاح/القيمة من ملف يتم حفظه في جلسات التطبيق. تشير رسالة الأشكال البيانية تستخدم مكتبة الإعدادات المفضّلة مثيل SharedPreferences خاصًا بحيث لا يتم الوصول إليها.

لنفترض مثلًا أن ما يلي: SwitchPreferenceCompat:

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

عندما يبدِّل المستخدم مفتاح التبديل هذا إلى "تفعيل" الحالة، ملف SharedPreferences باستخدام زوج المفتاح/القيمة "notifications" : "true". المفتاح المستخدم هو نفس مجموعة المفاتيح لـ Preference.

لمزيد من المعلومات حول واجهة برمجة تطبيقات SharedPreferences، يمكنك الاطّلاع على حفظ قيمة المفتاح.

للحصول على معلومات حول الطرق المختلفة لتخزين البيانات على Android، يُرجى الاطّلاع على البيانات. ونظرة عامة على تخزين الملفات.

متجر PreferenceDataStore

على الرغم من أنّ مكتبة الإعدادات المفضّلة تستمرّ في الاحتفاظ بالبيانات باستخدام SharedPreferences بحلول SharedPreferences ليست دائمًا حلاً مثاليًا. على سبيل المثال، إذا يتطلب تطبيقك من مستخدم تسجيل الدخول، فقد ترغب في الاستمرار إعدادات التطبيق على السحابة الإلكترونية بحيث تظهر الإعدادات عبر الأجهزة والأنظمة الأساسية الأخرى. وبالمثل، إذا تم إعداد التطبيق خيارات خاصة بالجهاز، ولكل مستخدم على الجهاز إعدادات منفصلة، لجعل SharedPreferences حلاً أقل من مثالية.

PreferenceDataStore يتيح لك استخدام خلفية مساحة تخزين مخصّصة للاحتفاظ بقيم Preference. لمزيد من المعلومات، معلومات، يُرجى الاطّلاع على استخدام مخزن بيانات مخصَّص.

قراءة القيم المفضَّلة

لاسترداد كائن SharedPreferences المستخدم، يمكنك استدعاء دالة الرسم PreferenceManager.getDefaultSharedPreferences() على الرغم من أنّ هذه الطريقة تعمل من أي مكان في تطبيقك، نقترح عليك ما يلي: تقوم بتقسيم التطبيق إلى طبقات. لمزيد من المعلومات، راجع البيانات .

على سبيل المثال، إذا كان الرمز EditTextPreference مع مفتاح "signature"، على النحو التالي: التالي:

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

يمكنك استرداد القيمة المحفوظة لهذه Preference في جميع أنحاء العالم، كما يلي:

Kotlin

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

Java

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

Kotlin

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

Java

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

بعد ذلك، عليك ضبط هذا المستمع مباشرةً setOnPreferenceChangeListener()، على النحو التالي:

Kotlin

preference.onPreferenceChangeListener = ...

Java

preference.setOnPreferenceChangeListener(...);

تنفيذ OnSharedPreferenceChangeListener

عند الاحتفاظ بقيم Preference باستخدام SharedPreferences، يمكنك أيضًا استخدام SharedPreferences.OnSharedPreferenceChangeListener للاستماع إلى التغييرات. ويتيح لك ذلك الانتباه إلى وقت تغيير القيم المحفوظة من خلال Preference، مثل مزامنة الإعدادات مع خادم. يوضح المثال التالي كيفية الاستماع إلى التغيّر في قيمة EditTextPreference باستخدام مفتاح "name":

Kotlin

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

Java

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

تسجيل المستمع باستخدام registerOnSharedPreferenceChangedListener()، على النحو التالي:

Kotlin

preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(...)

Java

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

Kotlin

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

Java

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

لإدارة مراحل النشاط في Activity أو Fragment بشكل سليم، يُرجى التسجيل إلغاء تسجيل المستمع هذا في استدعاءات onResume() وonPause()، كما هو موضح في المثال التالي:

Kotlin

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

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

Java

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

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

استخدام مخزن بيانات مخصص

مع أنّنا ننصح بالاحتفاظ بكائنات Preference باستخدام SharedPreferences، يمكنك أيضًا استخدام مخزن بيانات مخصص. يمكن أن يكون مخزن البيانات المخصص مفيدًا إذا كان التطبيق يحتفظ بالقيم في قاعدة بيانات أو إذا كانت القيم خاصة بالجهاز، كما هو موضح في الأمثلة التالية.

تنفيذ ملف تخزين البيانات

لتنفيذ مخزن بيانات مخصص، يمكنك إنشاء فئة تمتد PreferenceDataStore ينشئ المثال التالي مخزن بيانات يتعامل مع قيم String:

Kotlin

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

Java

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

تنفيذ أي عمليات تستغرق وقتًا طويلاً خارج سلسلة التعليمات الرئيسية لتجنّب حظر المستخدم من واجهة pyplot. لأنّه من الممكن أن تحتوي السمة Fragment أو Activity على إتلاف مخزن البيانات أثناء الاحتفاظ بقيمة، فقم بنشر البيانات بشكل تسلسلي لا تفقد أي قيم غيرها المستخدم.

تفعيل مخزن البيانات

بعد تنفيذ مخزن البيانات، تعيين مخزن البيانات الجديد في onCreatePreferences() بحيث تحتفظ كائنات Preference بالقيم مع مخزن البيانات بدلاً من استخدام SharedPreferences التلقائي. يمكنك تمكين مخزن البيانات لكل Preference أو للتسلسل الهرمي بالكامل.

لتفعيل مخزن بيانات مخصّص لجهاز Preference محدّد، يُرجى الاتصال setPreferenceDataStore() في Preference، كما هو موضَّح في المثال التالي:

Kotlin

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

Java

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

لتفعيل مخزن بيانات مخصص للتسلسل الهرمي بالكامل، اتصل setPreferenceDataStore() على PreferenceManager:

Kotlin

val preferenceManager = preferenceManager
preferenceManager.preferenceDataStore = dataStore

Java

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

إنّ مخزن البيانات الذي تم ضبطه على عنصر Preference محدّد يلغي أي مخزن بيانات يتم تعيينها للتسلسل الهرمي المقابل. في معظم الحالات، تقوم بتعيين مخزن بيانات التسلسل الهرمي بالكامل.