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

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

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

שנתחיל?

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

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

לפני שמתחילים, צריך להוסיף את התלות של ספריית ההעדפות ל-build.gradle file:

מגניב

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

Kotlin

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

אחרי Gradle Sync, אפשר לעבור לחלק ה-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 עבור האפליקציה, ניגשת לכל הערכים המאוחסנים, מחזירה אותם בלולאה ומדפיסה אותם יומן.