הגדרות   חלק מ-Android Jetpack.

ההגדרות מאפשרות למשתמשים לשנות את הפונקציונליות וההתנהגות של האפליקציה. ההגדרות יכולות להשפיע על ההתנהגות ברקע, למשל על תדירות הסנכרון של הנתונים עם הענן, או להשפיע על היבטים רחבים יותר, למשל שינוי התוכן והתצוגה של ממשק המשתמש.

כדי לשלב באפליקציה הגדרות שהמשתמש יכול לקבוע, צריך להשתמש בספריית ההעדפות של AndroidX. הספרייה הזו מנהלת את ממשק המשתמש ומקיימת אינטראקציה עם האחסון, כך שתוכלו להגדיר רק את ההגדרות הנפרדות שהמשתמש יכול להגדיר. הספרייה כוללת עיצוב Material Design שמספק חוויית משתמש עקבית במכשירים ובגרסאות של מערכות ההפעלה.

שנתחיל?

Preference הוא אבן הבניין הבסיסית של ספריית ההעדפות. מסך ההגדרות כולל היררכיה של Preference. אפשר להגדיר את ההיררכיה הזו כמשאב XML, או ליצור היררכיה בקוד.

בקטעים הבאים מוסבר איך ליצור מסך הגדרות פשוט באמצעות ספריית AndroidX Preference.

לפני שמתחילים, מוסיפים את התלות בספריית ההעדפות לקובץ 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.