الإعدادات جزء من Android Jetpack.

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

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

البدء

Preference هو المبنى الأساسي من مكتبة التفضيلات. تحتوي شاشة الإعدادات على Preference التسلسل الهرمي. يمكنك تعريف هذا التسلسل الهرمي كمورد XML، أو يمكنك إنشاء تسلسلاً هرميًا في الرمز البرمجي.

توضّح الأقسام التالية كيفية إنشاء شاشة إعدادات بسيطة باستخدام مكتبة الإعدادات المفضّلة لنظام AndroidX

قبل البدء، أضِف تبعية مكتبة الإعدادات المفضّلة إلى build.gradle. الملف:

Groovy

dependencies {
    implementation "androidx.preference:preference-ktx:1.2.0"
}

Kotlin

dependencies {
    implementation("androidx.preference:preference-ktx:1.2.0")
}

بعد مزامنة Gradle، يمكنك الانتقال إلى جزء XML من المهمة.

إنشاء تسلسل هرمي

في مشروعك، انتقِل إلى مجلد "res/xml" وأنشِئ ملف "preferences.xml" وأضف التعليمة البرمجية التالية إليه:

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

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

    <Preference
        app:key="feedback"
        app:title="Send feedback"
        app:summary="Report technical issues or suggest new features"/>

</PreferenceScreen>

يتضمّن هذا العرض الهرمي كائنَين Preference: SwitchPreferenceCompat تتيح للمستخدمين التبديل بين تفعيل الإعداد وإيقافه، وPreference الأساسية التي لا تتضمّن التطبيق المصغّر.

عند إنشاء تدرج هرمي، يجب أن يكون لكل Preference مفتاح فريد.

تضخيم التسلسل الهرمي

ولزيادة التسلسل الهرمي من سمة XML، يمكنك إنشاء PreferenceFragmentCompat، إلغاء onCreatePreferences(), وقدّم مورد XML الذي يمكن تكبيره، كما هو موضّح في المثال التالي:

Kotlin

class MySettingsFragment : PreferenceFragmentCompat() {
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.preferences, rootKey)
    }
}

Java

public class MySettingsFragment extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.preferences, rootKey);
    }
}

يمكنك بعد ذلك إضافة Fragment هذا إلى Activity كما تفعل مع أي جهاز آخر Fragment:

Kotlin

class MySettingsActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        supportFragmentManager
                .beginTransaction()
                .replace(R.id.settings_container, MySettingsFragment())
                .commit()
    }
}

Java

public class MySettingsActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.settings_container, new MySettingsFragment())
                .commit();
    }
}

يتم عرض النتيجة في الصورة التالية:

صورة تعرض مثالاً على شاشة التفضيلات
الشكل 1. شاشة إعدادات تم إنشاؤها باستخدام اثنين من "Preference" الأخرى.

مراقبة الإعدادات المفضّلة

يمكنك الحصول على حدث عندما يتغيّر أحد الإعدادات المفضّلة من خلال تسجيل أداة استماع لـ فهو:

Kotlin

findPreference<SwitchPreferenceCompat>("notifications")
    ?.setOnPreferenceChangeListener { _, newValue ->
        Log.d("Preferences", "Notifications enabled: $newValue")
        true // Return true if the event is handled.
    }

findPreference<Preference>("feedback")
    ?.setOnPreferenceClickListener {
        Log.d("Preferences", "Feedback was clicked")
        true // Return true if the click is handled.
    }

Java

SwitchPreferenceCompat notificationsPref = findPreference("notifications");

if (notificationsPref != null) {
    notificationsPref.setOnPreferenceChangeListener((preference, newValue) -> {
        Log.d("Preferences", String.format("Notifications enabled: %s", newValue));
        return true; // Return true if the event is handled.
    });
}

Preference feedbackPref = findPreference("feedback");

if (feedbackPref != null) {
    feedbackPref.setOnPreferenceClickListener((preference) -> {
        Log.d("Preferences", "Feedback was clicked");
        return true; // Return true if the event is handled.
    });
}

قراءة قيمة التفضيل الحالية

يخفي PreferenceFragmentCompat الكثير من الآلات المستخدمة في حفظ وقراءة التفضيلات. ومع ذلك، يتم تخزين كل شيء باستخدام SharedPreferences، ويمكنك قراءة هذه القيم كما تفعل عادةً مع SharedPreferences:

Kotlin

val preferences = PreferenceManager.getDefaultSharedPreferences(this).all

preferences.forEach {
    Log.d("Preferences", "${it.key} -> ${it.value}")
}

Java

var preferences = PreferenceManager.getDefaultSharedPreferences(context).getAll();

preferences.forEach((key, value) ->{
    Log.d("Preferences", String.format("%s -> %s", key, value));
});

يحصل المقتطف السابق على مثيل من السمة SharedPreferences التلقائية إلى التطبيق، ويصل إلى جميع القيم المخزنة، ويكررها، ويطبعها Logcat.