הגדרות חלק מ-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(); } }
התוצאה מוצגת בתמונה הבאה:
מעקב אחרי ההעדפות
כדי לקבל אירוע כשהעדפה משתנה, צריך לרשום לו מאזין:
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.