
EditText ולוחץ על לחצן. התוכנית מציגה את השם ב-TextView וצובעת את הרקע שלו בצבע. לקבלת מזהה הצבע משתמשים במחלקה ColorsManager של המרצה, והיא מבוססת על רפלקשן (מחוץ להיקף הקורס).EditText נשמר, אבל הטקסט והצבע של ה-TextView חוזרים לברירת המחדל. המרצה מסביר שאנדרואיד שומרת חלק מהמידע, בעיקר בתיבות קלט, כשה-layout זהה, אבל מה שנקבע בקוד נעלם.Toast ב-onCreate מופיע בכל סיבוב, כלומר האובייקט של האקטיביטי הוחלף באובייקט חדש.android:configChanges="orientation|screenSize" (בהקלטה נשמע "orientation vertical pipe screen size"). ההגדרה אומרת לאנדרואיד לא להחליף את אובייקט האקטיביטי בשינוי כיוון.onCreate רץ פעם אחת בלבד, והצבע והטקסט נשמרים גם בסיבובים חוזרים, באמולטור ובמכשיר האמיתי.onConfigurationChanged. בודקים אם newConfig.orientation שווה Configuration.ORIENTATION_PORTRAIT, ואם לא, מדובר בלנדסקייפ. בדוגמה מציגים Toast מתאים.onConfigurationChanged מופעל רק אם הוספנו את ההגדרה במניפסט.הטקסט המלא של הדקות הראשונות בהרצאה «Cancel Activity Recreation» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
הפתרון הראשון עבור שמירת ה-state של ה-activity בזמן שינוי האוריינטציה מתאים למצב שבו יש לנו layout אחד ויחיד ואנחנו כן רוצים שהמשתמש יוכל להסתכל על האפליקציה כ-portrait וכ-landscape ושה-layout יעבוד בשני המצבים אבל שיהיה layout אחד ולא שניים דבר ראשון יש לנו פה איזושהי תוכנית
מאוד פשוטה שמה שהיא עושה היא מבקשת מהמשתמש שם של צבע יש לנו לחצן ובלחיצה עליו אנחנו הולכים לראות את הצבע כתוב כאן בטקסט ויו והרקע של הטקסט ויו גם כן צבוע בצבע שנבחר.
קודם כל בואו נשלים את הקוד ונבצע את זה. יש לנו כאן את המיין אקטיביטי, יש לנו את שני הרכיבים האדיט טקסט קולור והטקסט ויו קולור. מה שאנחנו רוצים לעשות זה דבר ראשון לקבל את השם של הצבע, בואו ניקח color name ויהיה בה Edit Text Color, Get Text, 2-String והנה יש לנו את השם של הצבע שהיוזר
הכניס. לאחר מכן יש לנו את ה-Text View Color ואנחנו רוצים To Set Text את ה-Color Name ובצורה כזאת הצבע נכתב ולאחר מכן אנחנו רוצים לצבוע אותו ב-ID המתאים.
אז יש לנו קודם כל את ה-Color ID, אנחנו צריכים את הקוד של הצבע. יש לנו פונקציה שכתבתי למעשה כאן במחלקה נפרדת colors manager והמחלקה הזאת פשוט מכילה פונקציה שבעזרת מנגנון הרפלקשן מקבלת איזשהו שם של צבע ושולפת את ה-id שלו עבור המחלקה color.
רפלקשן זה מעבר לסקופ של המודול הזה של אנדרואיד אבל יש לנו כאן את הקטע קוד הפשוט שמוציא את הקוד של הצבע. אנחנו רוצים להשתמש איתו פה אז אנחנו פשוט קוראים לcolors manager שבנינו יש לנו כאן get color ID הנה ה-color name וכל מה שאנחנו רוצים לעשות זה לצבוע את הצבע רקע טקסט view color set
background color והנה ה-ID של הצבע ועכשיו כל הקוד מוכן יוזר לוחץ על הלחצן ואנחנו פשוט מעבירים את הטקסט וצובעים לו את הצבע אנחנו אנחנו רוצים לראות איך התוכנית הזאת מתנהגת כאשר אנחנו לא מטפלים עדיין בשינוי האוריינטציה.
בואו נריץ, הנה אנחנו רואים את התוכנית על האמולטור, בואו נכניס רד, נלחץ על הלחצן, אנחנו רואים כאן את הרד, ומה שנעשה זה קונטרול F12 ושימו לב שחלק מהמידע נשמר וחלק מהמידע נעלם.
למה חלק מהמידע נשמר וחלק מהמידע נעלם? אז קודם כל חלק מהמידע נשמר בגלל שאנחנו באותו הלאאוט ולא שני לאאוטים שונים בגלל שאנחנו באותו הלאאוט ויש פה לאאוט אחד ויחיד אנדרואיד כן הצליחה לשמור את המידע של תיבות אינפוט לדוגמה חלק מהמידע נעלם כי הלאאוט באמת נוצר מחדש ואז מה שהוגדר בלאאוט
כדיפולט הוחזר בחזרה לדוגמה הטקסט view הוחזר כדיפולט והקוד שלו לא נשמר, הטקסט שהיה עליו לא נשמר וגם הצבע שלו נשמר. בקיצור אם אנחנו מסתכלים על מה בעצם קרה כאן אנדרואיד כאשר יש לנו את אותו הלייאוט מסוגלת לשמור חלק מהמידע בעיקר תיבות input אבל לא רק וחלק מהמידע היא לא מסוגלת ומחזירה את זה לערכי הדיפולט שפשוט
לא היה כתוב כאן כלום. בואו ננסה להכניס צבע אחר, קח גרין הפעם נלחץ על הלחצן, הנה אנחנו רואים גרין Control F12 המחרוזת גרין של האדי טקסט נשארה המחרוזת גרין של הטקסט ניו נעלמה והצבע נעלם בואו ננסה את זה במכשיר נרשום ילו נלחץ על הלחצן הנה אנחנו רואים את הילו הכל בסדר נשנה אותו ללנסקייט והטקסט של האדי טקסט נשאר אבל הצבע והטקסט
של הטקסט ניו נעלמו בואו נחזיר את זה בחזרה לבלו לחץ על הלחצן הנה יש לנו פה בלו נחליף את זה לפורטרייט שוב אנחנו רואים שההתנהגות הזאת חוזרת עכשיו למה זה בעצם נהרס בגלל שאנחנו יודעים שאנדרואיד הורסת את האקטיביטי את האובייקט של האקטיביטי ויוצרת למעשה אובייקט חדש למעשה
היא לא בדיוק הורסת היא רק יוצרת אובייקט חדש ומחליפה את האובייקט הקודם באובייקט החדש בשביל להחליף את הלייאוט אנחנו לא רוצים אבל להחליף את הלייאוט יש לנו לייאוט אחד אבל זו ההתנהגות הדיפולטית של אנדרואיד.
אז אם אנחנו נשים פה לדוגמה טוסט, אנחנו הולכים לראות, כמו שראינו בסרטון הקודם, שהטוסט הזה מוצג לנו שוב פעם. בואו נשים פה דיס. יש לנו פה את הפונקציה onCreateLengthLongShow נריץ את זה.
הנה התוכנית רצה על האמולטור ואנחנו רואים את ה-onCreate. הנה התוכנית רצה על המכשיר ואנחנו רואים את ה-onCreate. אוקיי, בואו ניגש, נכניס פה איזה רד.
נלחץ show color ונסובב את האמולטור והנה אנחנו רואים שוב פעם את ה-on create וזה אומר שהכל נהרס ונבנה מחדש green נלחץ נסובב כל פעם שאנחנו מסובבים את המכשיר אנחנו בעצם רואים את ה-on create גם אם אנחנו נמצאים במכשיר האמיתי בואו נסובב במכשיר האמיתי נקבל on create נחזיר בחזרה נקבל on create מה אנחנו רוצים לעשות בשביל
לפתור את הסיטואציה הזאת כך שאנדרואיד לא תחליף לנו את האובייקט של האקטיביטי ותשאיר בעצם את אותו אקטיביטי.
הפתרון הוא ברמת המניפסט. בואו נחזור למניפסט ואנחנו צריכים לגשת לתגית האקטיביטי וכאן בתגית האקטיביטי לכתוב את ההוראה הבאה config changes = orientation vertical pipe screen size ההוראה הזאת כל מה שהיא אומרת לאנדרואיד זה נא לא להחליף את אובייקט האקטיביטי בשינוי האוריינטציה זה כל מה שזה
אומר אם אנחנו עכשיו כמו שזה נריץ את האפליקציה ונסתכל על מה קורה כאן ב-oncreate אנחנו נראה שה-oncreate בכלל לא מתבצעת היא תתבצע רק פעם אחת בהרצת התוכנית ולא תתבצע כל פעם שמשנים את האוריינטציה זה אומר שאנדרואיד לא תהרוס את האקטיביטי ותיצור
לנו אקטיביטי חדשה ואנחנו באמת לא צריכים שהיא תיצור אקטיביטי חדשה מפני שאנחנו לא רוצים להחליף את הלייאוט. זה בעצם העיקרון מפתח כאן שיש לנו לייאוט