PracticU

Cancel Activity Recreation

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA › Cancel Activity Recreation
מילון מושגים:
Activity - ב-Android, רכיב שמייצג מסך יחיד של האפליקציה שאיתו המשתמש מתקשר.
לייאאוט - ארגון וסידור הרכיבים החזותיים על המסך או בדף, כמו מיקום כפתורים, טקסט ותמונות.
סטייט - המידע על מצבו הנוכחי של רכיב או אפליקציה בזמן נתון, שמשתנה ומשפיע על מה שמוצג.
מחלקה - תבנית בתכנות מונחה עצמים שמגדירה אילו נתונים ופעולות יהיו לאובייקטים שנוצרים ממנה.
תגית - סימון בקוד, למשל ב-HTML, שתוחם רכיב ומגדיר את תפקידו או תכונותיו. גם תווית לסימון וקיטלוג פריטים.
Android - מערכת הפעלה מבוססת Linux לטלפונים ולמכשירים ניידים, שפותחה על ידי גוגל.
אמולטור - תוכנה שמחקה מכשיר או סביבה אחרת, למשל כדי להריץ ולבדוק אפליקציית מובייל על המחשב.
אירוע - התרחשות שהמערכת מזהה ויכולה להגיב לה, כמו לחיצת עכבר, הקשה או סיום פעולה.

Cancel Activity Recreation
כשיש לאפליקציה layout אחד בלבד, שמתאים גם לפורטרייט וגם ללנדסקייפ, אפשר לשמור על ה-State בלי לכתוב קוד שמירה: פשוט אומרים לאנדרואיד לא ליצור את האקטיביטי מחדש בשינוי כיוון.
הפתרון שלב אחר שלב
1. התוכנית לדוגמה: המשתמש מקליד שם צבע ב-EditText ולוחץ על לחצן. התוכנית מציגה את השם ב-TextView וצובעת את הרקע שלו בצבע. לקבלת מזהה הצבע משתמשים במחלקה ColorsManager של המרצה, והיא מבוססת על רפלקשן (מחוץ להיקף הקורס).
2. מה קורה בלי טיפול: אחרי סיבוב המסך הטקסט שב-EditText נשמר, אבל הטקסט והצבע של ה-TextView חוזרים לברירת המחדל. המרצה מסביר שאנדרואיד שומרת חלק מהמידע, בעיקר בתיבות קלט, כשה-layout זהה, אבל מה שנקבע בקוד נעלם.
3. הוכחה: Toast ב-onCreate מופיע בכל סיבוב, כלומר האובייקט של האקטיביטי הוחלף באובייקט חדש.
4. הפתרון במניפסט: בתגית של האקטיביטי מוסיפים android:configChanges="orientation|screenSize" (בהקלטה נשמע "orientation vertical pipe screen size"). ההגדרה אומרת לאנדרואיד לא להחליף את אובייקט האקטיביטי בשינוי כיוון.
5. התוצאה: onCreate רץ פעם אחת בלבד, והצבע והטקסט נשמרים גם בסיבובים חוזרים, באמולטור ובמכשיר האמיתי.
6. לדעת מתי הכיוון השתנה: כשמנעו את היצירה מחדש, אפשר לדרוס את onConfigurationChanged. בודקים אם newConfig.orientation שווה Configuration.ORIENTATION_PORTRAIT, ואם לא, מדובר בלנדסקייפ. בדוגמה מציגים Toast מתאים.
שימו לב
- הפתרון מתאים רק כש-layout אחד משרת את שני הכיוונים, כי האקטיביטי לא נוצרת מחדש ולכן ה-layout לא מוחלף.
- האירוע onConfigurationChanged מופעל רק אם הוספנו את ההגדרה במניפסט.
הפתרון הזה מאפשר לשמור את ה-State של האקטיביטי בסיבוב המסך כשיש layout יחיד.
השיעור הבא בקורס: Fixate Activity Orientation

פרקי ההרצאה: Cancel Activity Recreation

  1. 00:00

    פתרון ל-Activity עם Layout יחיד

  2. 00:41

    השלמת הקוד לצביעת הטקסט

  3. 01:20

    קבלת קוד הצבע מ-ColorsManager

  4. 02:33

    מה נשמר ומה נעלם בסיבוב

  5. 03:18

    למה תיבות Input נשמרות

  6. 04:50

    Android יוצרת את האקטיביטי מחדש

  7. 06:31

    הגדרת configChanges במניפסט

תמלול ההרצאה: Cancel Activity Recreation

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

  1. 00:02

    הפתרון הראשון עבור שמירת ה-state של ה-activity בזמן שינוי האוריינטציה מתאים למצב שבו יש לנו layout אחד ויחיד ואנחנו כן רוצים שהמשתמש יוכל להסתכל על האפליקציה כ-portrait וכ-landscape ושה-layout יעבוד בשני המצבים אבל שיהיה layout אחד ולא שניים דבר ראשון יש לנו פה איזושהי תוכנית

  2. 00:25

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

  3. 00:41

    קודם כל בואו נשלים את הקוד ונבצע את זה. יש לנו כאן את המיין אקטיביטי, יש לנו את שני הרכיבים האדיט טקסט קולור והטקסט ויו קולור. מה שאנחנו רוצים לעשות זה דבר ראשון לקבל את השם של הצבע, בואו ניקח color name ויהיה בה Edit Text Color, Get Text, 2-String והנה יש לנו את השם של הצבע שהיוזר

  4. 01:03

    הכניס. לאחר מכן יש לנו את ה-Text View Color ואנחנו רוצים To Set Text את ה-Color Name ובצורה כזאת הצבע נכתב ולאחר מכן אנחנו רוצים לצבוע אותו ב-ID המתאים.

  5. 01:20

    אז יש לנו קודם כל את ה-Color ID, אנחנו צריכים את הקוד של הצבע. יש לנו פונקציה שכתבתי למעשה כאן במחלקה נפרדת colors manager והמחלקה הזאת פשוט מכילה פונקציה שבעזרת מנגנון הרפלקשן מקבלת איזשהו שם של צבע ושולפת את ה-id שלו עבור המחלקה color.

  6. 01:46

    רפלקשן זה מעבר לסקופ של המודול הזה של אנדרואיד אבל יש לנו כאן את הקטע קוד הפשוט שמוציא את הקוד של הצבע. אנחנו רוצים להשתמש איתו פה אז אנחנו פשוט קוראים לcolors manager שבנינו יש לנו כאן get color ID הנה ה-color name וכל מה שאנחנו רוצים לעשות זה לצבוע את הצבע רקע טקסט view color set

  7. 02:17

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

  8. 02:37

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

  9. 02:58

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

  10. 03:26

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

  11. 03:53

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

  12. 04:28

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

  13. 04:55

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

  14. 05:11

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

  15. 05:31

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

  16. 05:46

    נלחץ show color ונסובב את האמולטור והנה אנחנו רואים שוב פעם את ה-on create וזה אומר שהכל נהרס ונבנה מחדש green נלחץ נסובב כל פעם שאנחנו מסובבים את המכשיר אנחנו בעצם רואים את ה-on create גם אם אנחנו נמצאים במכשיר האמיתי בואו נסובב במכשיר האמיתי נקבל on create נחזיר בחזרה נקבל on create מה אנחנו רוצים לעשות בשביל

  17. 06:22

    לפתור את הסיטואציה הזאת כך שאנדרואיד לא תחליף לנו את האובייקט של האקטיביטי ותשאיר בעצם את אותו אקטיביטי.

  18. 06:31

    הפתרון הוא ברמת המניפסט. בואו נחזור למניפסט ואנחנו צריכים לגשת לתגית האקטיביטי וכאן בתגית האקטיביטי לכתוב את ההוראה הבאה config changes = orientation vertical pipe screen size ההוראה הזאת כל מה שהיא אומרת לאנדרואיד זה נא לא להחליף את אובייקט האקטיביטי בשינוי האוריינטציה זה כל מה שזה

  19. 07:00

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

  20. 07:20

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

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

ההרצאה הקודמת: The Activity State Problem

ההרצאה הבאה: Fixate Activity Orientation

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

  • Activity Tracing
  • Activity Logs

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

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