PracticU

Find Fragment By ID

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA › Find Fragment By ID
מילון מושגים:
Fragment - ב-Android, רכיב ממשק הניתן לשימוש חוזר בתוך Activity, שמייצג חלק ממסך או התנהגות.
משתנה - שם שמפנה למקום בזיכרון שבו נשמר ערך שיכול להשתנות במהלך ריצת התוכנית, כמו מספר, טקסט או אובייקט.
Activity - ב-Android, רכיב שמייצג מסך יחיד של האפליקציה שאיתו המשתמש מתקשר.
אובייקט - יחידה בתכנות מונחה עצמים שמאגדת נתונים (תכונות) ופעולות (מתודות). נוצר בדרך כלל ממחלקה המשמשת כתבנית.
פונקציה - קטע קוד בעל שם שמבצע משימה מוגדרת, מקבל ערכי קלט (פרמטרים) ויכול להחזיר תוצאה. מאפשרת לארגן קוד ולהשתמש בו שוב.

Find Fragment By ID
בדיקת savedInstanceState מונעת הוספה כפולה של פרגמנט, אבל היא לא מספיקה: אחרי שינוי אוריינטציה המשתנה הגלובלי של הפרגמנט נשאר null. בהרצאה רואים איך לאתר מחדש את הפרגמנט שכבר מוצב באקטיביטי.
מה קורה בלי הבדיקה ועם הבדיקה
1. בלי ה-if: אחרי orientation change מתווספת פרגמנט שנייה על גבי הראשונה, ובגלילה רואים את הטקסט משתכפל.
2. עם ה-if: בודקים אם savedInstanceState שווה null, ורק אז יוצרים את הפרגמנט. אין שכפול, אבל המשתנה הגלובלי נשאר ריק בהרצה מחדש.
3. הקריסה: שינוי אוריינטציה ואז לחיצה על הלחצן מפעילה את הפרגמנט הגלובלי שהוא null, והאפליקציה קורסת.
4. הפתרון ב-else: כשהאקטיביטי נוצרת מחדש, ה-if לא מתבצע, ולכן ב-else מאתרים את הפרגמנט ומכניסים אותו חזרה למשתנה.
5. למה לא findViewById: ה-ID שיש לנו שייך ל-frameLayoutContainer, ולכן findViewById תחזיר אובייקט FrameLayout ולא פרגמנט.
6. הדרך הנכונה: קוראים ל-getSupportFragmentManager().findFragmentById(R.id.frameLayoutContainer) ועושים casting ל-AnimalFragment, כי הפונקציה מחזירה פרגמנט בסיסי.
פקודות והגדרות
getSupportFragmentManager().findFragmentById(R.id.frameLayoutContainer), ואחריה casting ל-AnimalFragment.
אחרי התיקון הלחצן עובד גם לאחר שינוי אוריינטציה, והפרגמנט לא מתווספת פעם נוספת. כעת אפשר לאתר פרגמנט שכבר הוצב באקטיביטי ולהשתמש בו שוב.
השיעור הבא בקורס: שמירת Fragment Instance

פרקי ההרצאה: Find Fragment By ID

  1. 00:00

    בדיקת savedInstanceState ביצירת Fragment

  2. 00:47

    שכפול Fragment בשינוי אוריינטציה

  3. 01:25

    קריסה בלחיצה אחרי שינוי אוריינטציה

  4. 02:39

    איתור ה-Fragment מחדש ב-else

  5. 03:19

    למה findViewById לא מתאים ל-Fragment

תמלול ההרצאה: Find Fragment By ID

הטקסט המלא של הדקות הראשונות בהרצאה «Find Fragment By ID» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:08

    כאשר אנחנו יוצרים אובייקט פרגמנט, ראינו שחשוב לבצע את זה בתוך האיף הזה שבודק האם אנחנו נמצאים בהרצה הראשונה של האקטיביטי ולא לדוגמה באוריינטיישן צ'יינג' את זה עשינו על ידי בדיקת ה-saved instant state, האם הוא שווה לנל. אם כן אנחנו בהרצה ראשונה, אם לא אנחנו כנראה באוריינטיישן צ'יינג' בואו רגע נבדוק שוב פעם מה היה קורה אם לא היינו בודקים את האיף הזה

  2. 00:39

    בואו רגע נריץ, אנחנו רואים שהמערכת רצה יש לנו פה את הפרגמנט, אנחנו רואים שהכל בסדר, נבצע orientation change ומה שקרה והתווספה פרגמנט שנייה על גבי הפרגמנט הראשונה ואנחנו אפילו יכולים לראות את זה כאשר אנחנו מבצעים כאן סקרולינג ואנחנו ממש רואים את הכתב משתכפל, הפרגמנט הראשונה נמצאת מאחור הסטטית ואנחנו מזיזים את הפרגמנט העליונה יותר

  3. 01:08

    אנחנו כמובן רצינו להימנע מהדבר הזה, אין לנו שום צורך להוסיף את אותה הפרגמנט כמה פעמים ולכן מה שעשינו זה פשוט מאוד ביצענו את ה-if הזה וכביכול הבעיה נפטרה בואו נריץ שוב, אנחנו רואים את ההרצאה הראשונה, פרגמנט אחת בלבד, בואו נבצע שינור אוריינטציה, והנה אנחנו רואים שהכל יסתדר כמו שצריך, אבל האם הקוד הזה הוא קוד מספק?

  4. 01:41

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

  5. 01:59

    אבל אנחנו משתמשים עם אובייקט הפרגמנט הגלובלי, אבל רגע, כאשר אנחנו משנים את האוריינטציה, אז בעצם האובייקט הזה כבר מחזיק נל. אז מה יקרה אם אנחנו נשנה את האוריינטציה ואז נלחץ על הלחצן?

  6. 02:17

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

  7. 02:43

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

  8. 03:05

    יש לנו כמובן את הפונקציה FindViewById. הפונקציה FindViewById מקבלת את ה-ID של הרכיב שאנחנו מחפשים ומאתרת אותו ומחזירה אותו. אבל למעשה אנחנו לא באמת יכולים להשתמש איתה עבור איתור פרגמנט.

  9. 03:25

    מפני שה-ID שיש לנו זה לא של הפרגמנט. ה-ID שיש לנו זה r.id.frameLayoutContainer. זאת אומרת שאם אנחנו נשתמש ב-find-view-by-id ונשלח לה את ה-frame-layout-container

לקורס המלא: קורס פיתוח אפליקציות לאנדרואיד

ההרצאה הקודמת: קבלת מידע בחזרה מ-Fragment

ההרצאה הבאה: שמירת Fragment Instance

הרצאות קשורות מקורסים אחרים

  • WebElement - Find by ID
  • שימוש ב-Fragment ב-React

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת JAVA - קורס ג'אווה למתחילים
  • קורס פיתוח אפליקציות - לאייפון iPhone iOS - ב-Swift-Xcode
  • קורס פלאטר - Flutter - שפת DART של גוגל למובייל - פיתוח אפליקציות לאנדרואיד ואייפון
  • קורס PhoneGap - פיתוח אפליקציות לאנדרואיד ואייפון