
savedInstanceState מונעת הוספה כפולה של פרגמנט, אבל היא לא מספיקה: אחרי שינוי אוריינטציה המשתנה הגלובלי של הפרגמנט נשאר null. בהרצאה רואים איך לאתר מחדש את הפרגמנט שכבר מוצב באקטיביטי.savedInstanceState שווה null, ורק אז יוצרים את הפרגמנט. אין שכפול, אבל המשתנה הגלובלי נשאר ריק בהרצה מחדש.else מאתרים את הפרגמנט ומכניסים אותו חזרה למשתנה.frameLayoutContainer, ולכן findViewById תחזיר אובייקט FrameLayout ולא פרגמנט.getSupportFragmentManager().findFragmentById(R.id.frameLayoutContainer) ועושים casting ל-AnimalFragment, כי הפונקציה מחזירה פרגמנט בסיסי.getSupportFragmentManager().findFragmentById(R.id.frameLayoutContainer), ואחריה casting ל-AnimalFragment.הטקסט המלא של הדקות הראשונות בהרצאה «Find Fragment By ID» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
כאשר אנחנו יוצרים אובייקט פרגמנט, ראינו שחשוב לבצע את זה בתוך האיף הזה שבודק האם אנחנו נמצאים בהרצה הראשונה של האקטיביטי ולא לדוגמה באוריינטיישן צ'יינג' את זה עשינו על ידי בדיקת ה-saved instant state, האם הוא שווה לנל. אם כן אנחנו בהרצה ראשונה, אם לא אנחנו כנראה באוריינטיישן צ'יינג' בואו רגע נבדוק שוב פעם מה היה קורה אם לא היינו בודקים את האיף הזה
בואו רגע נריץ, אנחנו רואים שהמערכת רצה יש לנו פה את הפרגמנט, אנחנו רואים שהכל בסדר, נבצע orientation change ומה שקרה והתווספה פרגמנט שנייה על גבי הפרגמנט הראשונה ואנחנו אפילו יכולים לראות את זה כאשר אנחנו מבצעים כאן סקרולינג ואנחנו ממש רואים את הכתב משתכפל, הפרגמנט הראשונה נמצאת מאחור הסטטית ואנחנו מזיזים את הפרגמנט העליונה יותר
אנחנו כמובן רצינו להימנע מהדבר הזה, אין לנו שום צורך להוסיף את אותה הפרגמנט כמה פעמים ולכן מה שעשינו זה פשוט מאוד ביצענו את ה-if הזה וכביכול הבעיה נפטרה בואו נריץ שוב, אנחנו רואים את ההרצאה הראשונה, פרגמנט אחת בלבד, בואו נבצע שינור אוריינטציה, והנה אנחנו רואים שהכל יסתדר כמו שצריך, אבל האם הקוד הזה הוא קוד מספק?
בואו שוב פעם נריץ ונבדוק מה קורה אם אנחנו לוחצים על הלחצן. אז הנה אנחנו רצים, אנחנו מבצעים לחיצה על הלחצן, ואנחנו בעצם רואים את השינוי מידע של הפרגמנט, זה יתבצע כמובן בלחצן עצמו.
אבל אנחנו משתמשים עם אובייקט הפרגמנט הגלובלי, אבל רגע, כאשר אנחנו משנים את האוריינטציה, אז בעצם האובייקט הזה כבר מחזיק נל. אז מה יקרה אם אנחנו נשנה את האוריינטציה ואז נלחץ על הלחצן?
בואו נריץ את זה שוב. נשנה כעת את האוריינטציה ונלחץ על הלחצן. ומה שאנחנו מקבלים זה כמובן קריסה. אז אנחנו צריכים עכשיו לטפל במצב הזה. אנחנו לא רוצים בעצם שכמובן התוכנית לא תיאתר את הפרגמנט בשינוי האוריינטציה.
מה שאנחנו צריכים לעשות זה כאשר האקטיביטי נוצרת מחדש, כמובן האיף הזה לא מתבצע, אנחנו צריכים לאתר את הפרגמנט ולהחזיר אותה לאנימל פרגמנט. אז כמובן אנחנו יכולים לבצע פה else ואנחנו צריכים להגיע לאנימל פרגמנט ולהכניס לתוכו את אובייקט הפרגמנט.
יש לנו כמובן את הפונקציה FindViewById. הפונקציה FindViewById מקבלת את ה-ID של הרכיב שאנחנו מחפשים ומאתרת אותו ומחזירה אותו. אבל למעשה אנחנו לא באמת יכולים להשתמש איתה עבור איתור פרגמנט.
מפני שה-ID שיש לנו זה לא של הפרגמנט. ה-ID שיש לנו זה r.id.frameLayoutContainer. זאת אומרת שאם אנחנו נשתמש ב-find-view-by-id ונשלח לה את ה-frame-layout-container