
findFragmentById: שמירה ושחזור שלו דרך ה-state של האקטיביטי.onCreate יוצר את הפרגמנט בהרצה ראשונה בלבד, וב-else מחזיר את הפרגמנט שעל האקטיביטי לאובייקט הגלובלי.onSaveInstanceState נקראת רגע לפני שינוי ה-configuration, ו-onRestoreInstanceState משחזרת את מה ששמרנו.outState יש putString, putInt, putDouble ועוד, וגם putSerializable ו-putParcelable, אבל פרגמנט אינו Serializable ואינו Parcelable, ולכן אי אפשר לשמור אותו כך.onSaveInstanceState קוראים ל-getSupportFragmentManager().putFragment(outState, key, fragment). מקובל לתת למפתח את שם אובייקט הפרגמנט.onRestoreInstanceState בודקים ש-savedInstanceState אינו null, ואז מכניסים ל-animalFragment את התוצאה של getFragment(savedInstanceState, key) עם casting.super ב-onSave וב-onRestore. בלעדיהן התוכנית לא תעבוד כמו שצריך ואף תקרוס.putFragment ו-getFragment שומרות רק את האינסטנס, כלומר את האובייקט עצמו. המידע הפנימי של הפרגמנט לא נשמר: אחרי לחיצה על הלחצן ושינוי אוריינטציה נוסף, התוכן חזר מ-Puppy ל-בני. שמירת ה-state הפנימי נעשית בתוך הפרגמנט, וזה הנושא של ההרצאה הבאה.putFragment ו-getFragment.הטקסט המלא של הדקות הראשונות בהרצאה «שמירת Fragment Instance» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
בסרטון הקודם ראינו למה כדאי לנו לבצע if-else ב-onCreate עבור יצירת אובייקט הפרגמנט. ומה שראינו זה שה-if בודק האם אנחנו רצים ריצה ראשונה ואז אנחנו רוצים לבצע יצירה חדשה של אובייקט הפרגמנט פעם אחת בלבד ולצרף אותה לאקטיביטי.
ואם לדוגמה יוזר מבצע orientation change, אז ה-if לא יתבצע, ה-else יתבצע, ואנחנו מעטרים את הפרגמנט שנמצאת על האקטיביטי, מחזירים אותה לאובייקט הפרגמנט הגלובלי, בכדי שנוכל להמשיך להשתמש איתו במהלך חיי האפליקציה.
אבל קיימת עוד שיטה לשחזר את אובייקט הפרגמנט. אנחנו ראינו בעבר שיש לנו אפשרות לבצע שחזור של state של האקטיביטי. את זה עשינו על ידי שתי פונקציות, on, save, instance, state, זאת פונקציה ראשונה שכתבנו בכדי לבצע בעצם שמירה של ה-state ברמת האקטיביטי, בואו רגע נדרוס אותה, ויש לנו עכשיו אפשרות לבצע שמירה
של דברים כאשר ה-configuration change, לדוגמה כאשר ה-orientation משתנה, אנחנו יכולים לבצע פה שמירה מסוימת ובפונקציה שנקראת onRestoreInstanceState אנחנו בעצם רוצים להחזיר את ה-state ששמרנו ודרך שתי הפונקציות האלה גם יש לנו אפשרות לבצע שמירה והחזרה של הפרגמנט במקום האלס הזה
עדיין יש לנו פה את העיף כי בהרצה הראשונה אנחנו רוצים לבצע יצירה של הפרגמנט ואנחנו לא רוצים לבצע יצירה של הפרגמנט מעבר להרצה הראשונה. אבל יש פה איזושהי סיטואציה.
השמירה מתבצעת על ידי ה-out state. וה-out state מכיל כל מיני פונציות שמאפשרות להכניס מידע. לדוגמה string, לדוגמה int, לדוגמה put double וכדומה אבל אין פונקציה שנקראת put fragment בכדי לשמור אובייקט יש לנו שתי פונקציות put serializable אם כמובן המחלקה ממשה interface serializable וput parcelable אם המחלקה
ממשה interface parcelable fragment היא לא serializable ולא parcelable זאת אומרת שאנחנו לא יכולים להשתמש ב-out state בכדי לבצע שמירה של הפרגמנט.
אז איך בכל זאת אנחנו יכולים לשמור את הפרגמנט ולשחזר אותה? על ידי getSupportFragmentManager. יש לנו פונקציה שנקראת putFragment. כאן אנחנו נותנים את ה-out state.
אנחנו נותנים איזשהו מפתח. מה שמקובל לעשות זה שהשם של המפתח יהיה השם של אובייקט הפרגמנט בואו נעשה copy-paste והפרמטר הבא ואת אובייקט הפרגמנט שאנחנו רוצים לבצע שמירה לגביו ואז putFragment מה שתעשה זה תדע איך להכניס את אובייקט הפרגמנט הזה בעצמה לתוך ה-out state זה בעצם השמירה עצמה בפונקציה onSave
שמתבצעת שנייה לפני שהאוריינטיישן משתנה והאקטיביטי מאבדת את המידע שלה מה אנחנו רוצים לעשות ב-onRestoreInstanceState? אנחנו רוצים קודם כל לבצע בדיקה האם ה-savedInstanceState שקיבלנו הוא לא null מפני שגם בהרצאה הראשונה הפונקציה הזאת יכולה להתבצע ושם אנחנו לא רוצים לשלוף את הפרגמנט אז בואו ניגש לאובייקט
הפרגמנט, AnimalFragment ונכניס לתוכו casting של Animal Fragment נקרא ל-Get Support Fragment Manager ונקרא לפונקציה Get Fragment בדיוק כמו שיש לנו Put Fragment יש לנו Get Fragment ניתן את ה-Saved Instant State שכבר מכיל את אובייקט הפרגמנט
ואת השם של הפרגמנט ששמרנו שזה היה Animal Fragment נעתיק, נדביק וזה בעצם הקוד שמשחזר את הפרגמנט יכלנו לקחת את השורה הזאת ולשים אותה כאן ב-else במקום לבצע את הפונקציה של ה-on-restore זה גם כן היה בסדר וזה היה אותו הדבר מפני שה-saved instant state הזה שאנחנו רואים כאן
זה בדיוק ה-saved instant state הזה אם הוא שונה מנהל אנחנו יכולים לשחזר את הפרגמנט