
PreferenceActivity נותנת. בשיעור בונים מסך Settings שנפתח מתפריט האפליקציה ובודקים בו כמה סוגי רכיבים.SettingsActivity ומכבים את Generate Layout File. במקום לרשת מ-AppCompatActivity, היא יורשת מ-PreferenceActivity.settings ששורשו PreferenceScreen. התוכן הוא רכיבי UI מיוחדים, וכל ערך שהמשתמש מזין בהם נשמר אוטומטית ב-Shared Preferences.onCreate קוראים ל-addPreferencesFromResource(R.xml.settings). מהתפריט ב-MainActivity מפעילים אותה עם Intent רגיל ו-startActivity.key של כל רכיב הוא המפתח שנשמר, והקלט של המשתמש הוא הערך. נהוג להתחיל אותו בשם הרכיב, למשל editTextPreferenceEmail.getPreferenceScreen().findPreference(key) (עם cast), ואת הערך מ-PreferenceManager.getDefaultSharedPreferences. מציגים אותו ב-setSummary. כדי שה-summary יתעדכן מיד, רושמים setOnPreferenceChangeListener ושם קוראים ל-setSummary(newValue.toString()). אם הפונקציה מחזירה true הערך החדש נשמר ומוצג בפתיחה הבאה. עם false התיבה תיפתח ריקה.entries ואת entryValues כשני string-array בקובץ resources: הראשון מציג למשתמש, והשני הוא קודים פנימיים.dependency ומפתח, ואז הם אפורים עד שמסמנים אותו.title.getString, מבצעים Color.parseColor וקוראים ל-setBackgroundColor על android.R.id.content. בנוסף רושמים OnPreferenceChangeListener לצביעה מיידית.title. הוא מופיע כפריט שנפתח למסך נפרד.intent עם action מסוג view ו-data עם כתובת אתר, וכך לחיצה על הפריט פותחת implicit intent לדפדפן.onCreate לא מתעדכן לבד כשהערך משתנה, כי onCreate לא רץ שוב. צריך listener.parseColor. הפתרון היה להשתמש בשמות צבע סטנדרטיים מלאים, וגם לנקות את הנתונים הישנים (App info, אחסון, Clear Data), כי הם הכילו ערך שגוי.MainActivity הצבע לא התעדכן אחרי חזרה מההגדרות עד שהוסיפו קוד ב-onResume, שקורא שוב את הערך מ-Shared Preferences.הטקסט המלא של הדקות הראשונות בהרצאה «Shared Preferences Activity» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
בגלל שהעבודה עם Shared Preferences זה דבר מאוד נפוץ באפליקציות, בנו באנדרואיד אקטיביטי מיוחדת עבור Shared Preferences. האקטיביטי הזאת שבנו מאפשרת גם להציג ממשק משתמש שמותאם להעדפות של המשתמש, וגם מבצעת אוטומטית שמירה של המידע ב-Shared Preferences.
אז בואו נראה איך אנחנו יכולים לעבוד עם האקטיביטי הזאת במקום לבנות את הממשק משלנו ולשמור בעצמנו את המידע ל-Shared Preferences. דבר ראשון, יש לנו פה אפליקציה שבמסך הראשי בעצם אין שום דבר, יש לנו רק ליניאר לאט עם איזשהו ID, אבל מה שיש לנו פה זה מניו ובמניו הזה יש לנו סך הכל Settings.
עכשיו במיין אקטיביטי יש לנו בלחיצה על תפריט ה-Settings איזשהו אירוע, שבו אנחנו רוצים להציג את ה-activity הזאת של ה-shared preferences.
יש לנו כמובן onCreateOptions מניו שפשוט מציג את התפריט הזה. אז אם אנחנו מסתכלים מה בעצם יש לנו כרגע באפליקציה זה סך הכל מסך ריק, יש לנו פה את ה-Options מניו עם Settings שכרגע לא עושה שום דבר.
מה שאנחנו רוצים לעשות זה לבנות את ה-Shared Preferences Activity, לקרוא לה מהמניו ולראות איך בדיוק מתבצע כל העבודה עם האקטיביטי הזאת. דבר ראשון, אנחנו צריכים לצרף אקטיביטי חדשה לגמרי, בואו אפילו ניקח Empty Activity ונקרא לה Settings Activity.
כמובן שאפשר לקרוא לה בכל שם שהוא, אבל מה שאנחנו לא רוצים זה לייצר ליהאוט, אז בואו נוריד את ה-Generate Layout File. לאקטיביטי הזאת אין לייאוט סטנדרטי שאנחנו מכירים.
אנחנו כן הולכים להגדיר איזה ממשק משתמש הולך להיות שם אבל לא בקובץ לייאוט סטנדרטי. בואו נבצע פיניש ויש לנו כעת רק מחלקה פשוטה לגמרי יש לנו פה את הפונקציה onCreate יש פה את הפונקציה הראשונה של הסופר קריאה ל-onCreate אבל אין כאן את ההגדרה של מי הלייאוט שלנו.
הדבר הבא שאנחנו רוצים לעשות זה לא לרשת מ-AppCompatActivity אלא אנחנו רוצים לרשת מ-PreferenceActivity וזה אוטומטית הופך את ה-Activity שלנו ל-Activity המיוחדת הזאת שמסוגלת להציג את המידע לגבי ה-Shared Preferences.
כעת אנחנו רוצים להגדיר את ממשק המשתמש או ה-Layout שיוצג על ה-Activity הזאת. אז שימו לב איך זה מתבצע. הדבר הזה מתבצע על ידי קובץ xml שנמצא בתיקיית xml ב-resources.
אז הדבר הראשון שאנחנו הולכים להוסיף זה android resource directory ואנחנו הולכים לבחור ב-xml. בואו נבצע אוקיי והנה יש לנו כאן דירקטורי של xml.
עכשיו אנחנו נכנסים ומוסיפים xml resource file ובואו נקרא ל-resource הזה settings. יכול להיות גם כל שם שאתם בוחרים. נבצע אוקיי ויש לנו Preferences Screen. עכשיו התגית הזאת של ה-Preferences Screen זאת תגית השורש של כל ממשק המשתמש שאנחנו הולכים לראות ב-Settings Activity.
אז מה אנחנו הולכים לעשות? אנחנו הולכים פשוט לבנות כאן תגיות מיוחדות שהתפקיד שלהן זה להציג פריטי UI על ה-Activity. ונתחיל לראות כל מיני פריטי UI, רכיבי UI שאנחנו יכולים להציג בסטינגס אקטיביטי שאנחנו בונים.
והדבר הראשון שאנחנו הולכים לראות זה Edit Text Preference. Edit Text Preference זה כמובן Edit טקסט רגיל, שימו לב גם שאפשר לראות אותו כאן בחלון.
עכשיו, אני מזכיר, כל מה שאנחנו עושים כרגע זה לבנות ממשק משתמש, אבל זה לא סתם ממשק משתמש, הוא אוטומטית ישמור את המידע שהיוזר מכניס אליו ב-Shared Preferences.
זה מה שמיוחד בו. אז בואו נמשיך. יש לנו כאן את ה-Edit Text Preference ואנחנו רוצים להגדיר לו מספר הגדרות.
דבר ראשון ה-ID שלו מתבצע על ידי מפני שאנחנו זוכרים שה-Shared Preferences מכיל גם Key וגם Value עבור כל פריט שאנחנו שומרים בתוכו.
מה שקורה עם הרכיבי UI האלה ושה-Key שאנחנו נותנים להם זה ה-Key שהולך להישמר ב-Shared Preferences והמידע שהם קולטים מהיוזר זה ה-Value. אז קודם כל בואו פשוט נמציא Key וכמו שמקובל אז כל פעם שאנחנו כאילו נותנים ID הוא מתחיל בשם של הרכיב ולכן זה יהיה Edit, Text, Preference ואז מה אנחנו רוצים לקלוט.
בואו נתחיל עם E-Mail. נניח שאנחנו רוצים לקלוט מהמשתמש אימייל ולשמור את זה בפרפרנסס. הדבר הבא שאנחנו יכולים להגדיר זה טייטל, מה רואים בתיבה, enter your email.
הדבר הבא שאנחנו רוצים לעשות זה לקחת את הפרפרנס הזה, את ה... ליתר דיוק ה-XML הזה, ולהגדיר שהקובץ XML הזה שבנינו זה זה בדיוק הלייאוט שמופיע באקטיביטי הזאת שבנינו וזה מתבצע באופן הבא.
אנחנו מגיעים לפונקציה שנקראת add preferences from resource ואנחנו נותנים לו את הקוד של ה-resource r.xml.settings בצורה כזאת. בואו נסתפק כרגע בזה ורק נריץ את האקטיביטי.
לצורך כך נחזור למיין אקטיביטי ובמניו אנחנו רוצים לבנות intent ולהצביע על settings activity מפני שזאת אקטיביטי רגילה לגמרי. יש לנו פה settingsactivity.class ואז start activity והנה ה-intent שלנו בצורה כזאת וזה כל מה שאנחנו רוצים לעשות בקליק על המניו.
בואו נריץ, נלחץ על המניו של הסטינגס, נבחר בסטינגס ואנחנו מגיעים לפרפרנס אקטיביטי. ואנחנו רואים שיש לנו פה את התיבה enter your email, שאנחנו יכולים פשוט ללחוץ עליה ומופיע לנו דבר כזה נחמד כמו דיאלוג כזאת enter your email, אז בואו נכניס את מוישה, את gmail.com,
נבצע אוקיי והמידע אמור להישמר בפרפרנסס. בואו נראה כמה דברים לגבי זה. נניח שאנחנו רוצים עכשיו לחזור בחזרה ובעצם לסיים את התוכנית, בואו נסיים אותה ולהריץ את כל התוכנית מחדש.
בואו ניכנס שוב פעם ל-settings, ניגש ונראה שהאימייל עדיין נשמר לנו. זאת אומרת שהמערכת שמרה אותו ב-shared preferences, היא לא שמרה אותו בקבצים אחרים, זה ספציפית מותאם ל-shared preferences, ועכשיו היא טענה את האימייל בחזרה, ואנחנו יכולים כמובן לערוך אותו אם אנחנו רוצים, לבצע אוקיי או cancel.
אבל אנחנו לא רואים כאן בחלון של ה-Settings Activity את האימייל. רק אם המשתמש נכנס, אז בעצם הוא רואה את האימייל הקודם שהוא הכניס.
אנחנו יכולים גם להציג כאן את המידע. בואו נעשה את זה. מה שאנחנו צריכים לעשות זה לגשת ל-Settings Activity, וכמובן בפונקציית ה-onCreate כאשר בעצם החלון הזה, האקטיביטי הזאת מוצגת.
אז אנחנו רוצים לקבל את האימייל ולהציג אותו בתיבה. אז איך אנחנו מקבלים את האימייל? לצורך כך אנחנו צריכים שני רכיבים. רכיב אחד נקרא PreferenceScreen וזה מאפשר לנו הוא גישה לכל החלון עצמו ל-UI ולרכיבים שנמצאים בתוך קובץ ה-XML.
אז בואו נבנה PreferenceScreen ונקרא לפונקציה שנקראת GetPreferenceScreen והיא שייכת ל-PreferenceActivity שירשנו. הרכיב השני שאנחנו צריכים וה-Shared Preferences שכבר עבדנו איתו.
בואו נבנה את ה-SharedPreference שווה ואנחנו מגיעים אליו על ידי reference-manager.get-default-shared- preferences וזה בעצם האפשרות שלנו לקבל את ה-preferences שנשמרו על ידי ה-settings-activity.
הוא מבקש מאיתנו רק קונטקסט, בואו ניתן לו את עצמנו ועל ידי שני הרכיבים האלה אנחנו יכולים גם להגיע לרכיבי ה-UI שנמצאים בחלון וגם למידע שנשמר בפרפרנסס, בואו נעשה את זה.
אז דבר ראשון, מה שאנחנו רוצים לעשות זה לגשת לפרפרנסס סקרין שבנינו, שקיבלנו, ולקבל ממנו את הרכיב. אנחנו רוצים לקבל ממנו find preference, שזה מאפשר לנו לחפש רכיב, זה כמו ה-find view by ID.
אנחנו רוצים לתת לו את ה-ID של הרכיב או את המפתח, זה היה edit, טקסט פרפרנס אימייל עכשיו אנחנו רוצים לקבל את זה לרכיב אדיט טקסט פרפרנס ואנחנו רוצים לקרוא לו אדיט טקסט פרפרנס אימייל כי זה בעצם הרכיב שלנו ורק צריך לבצע פה איזשהו קאסטינג כי פיינד פרפרנס יכולה להחזיר לנו כל מיני רכיבי
UI אנחנו רוצים קאסטינג לאדיט טקסט פרפרנס אז הנה יש לנו את השורה הזאת בואו נרחיק טיפה את החלון ובעזרת השורה הזאת אנחנו מקבלים את הרכיב עצמו של ה-Edit Text Preferences.
כעת אנחנו רוצים לשלוף את האימייל מה-Shared Preferences. אז בואו נבנה פה סטרינג אימייל, ניגש ל-Shared Preferences, Get String, ואנחנו רוצים לתת בדיוק את אותו המפתח, Edit Text Preferences E-Mail וערך ברירת מחדל ויהיה מחרוזת ריקה.
הדבר הבא שאנחנו רוצים לעשות זה לגשת לרכיב הוויזואלי שמצאנו Edit Text Preferences E-Mail ו-To Set Summary. Set Summary מכניס לתוכו את המידע הנוסף שאנחנו רוצים להציג, שבמקרה הזה זה האימייל.
בואו נריץ, נפנה למניו של ה-Settings ואיך שהחלון של ה-Shared Preferences עולה, אנחנו כבר רואים פה את האימייל.
אנחנו כמובן יכולים להציג את זה בצורה אחרת your email is לעטוף את זה בסוגריים מה שבא לנו כרגע הצלחנו פשוט להציג מידע נוסף על החלונית הזאת שבמקרה הזה זה האימייל של היוזר כמובן שאם אנחנו לוחצים אנחנו יכולים לשנות את האימייל הזה בואו נקרא לו מוישה 1980 נבצע אוקיי אבל אנחנו לא רואים שזה משתנה בחלון למה?
מפני שהטקסט הזה שהכנסנו, הכנסנו אותו ב-onCreate, אבל ה-onCreate לא מתבצע עוד פעם, הוא יתבצע אם אנחנו נחזור בחזרה וניכנס עוד פעם ל-Settings.
כאן אנחנו רואים שהוא מתבצע. איך אנחנו יכולים תוך כדי השינוי כבר להגדיר את המידע העדכני? בואו נכניס מוישה 2, אוקיי, ואנחנו רוצים כבר עכשיו לראות את מוישה 2.
לצורך כך אנחנו צריכים להירשם לאירוע של שינוי ה-Preference ובאירוע הזה לעדכן את ה-E-Mail. בואו נבצע את זה.
אז האירוע שאנחנו רוצים להירשם אליו שייך לרכיב הוויזואלי Edit Text Preference E-Mail והוא נקרא Set on Preference Change Listener.
אנחנו רוצים לבוא ולבנות אובייקט חדש מסוג On Preference Change Listener בדיוק כמו שהוא אומר לנו שם. ואנחנו רואים שיש לנו פה פונקציה שנקראת onPreferenceChange.
הפונקציה הזאת מקבלת את ה-preference עצמו, זה הרכיב הוויזואלי שגרם לשינוי, ואת האובייקט החדש ששונה. כל מה שאנחנו רוצים לעשות בפונקציה זה להציג את האובייקט החדש.
אז אנחנו רוצים לבוא