
ViewGroup, וכך גם רכיבים אחרים שמכילים רכיבי ילד. מכיוון שאפשר לגשת מהקוד לילדים של Layout, אפשר לבצע פעולה על כולם בבת אחת. השיעור מראה איך עושים זאת, כולל Layout מקוננים.RelativeLayout מזהה, מאתרים אותו עם findViewById וקוראים ל-getChildCount(). ב-Ctrl ובריחוף על המחלקה רואים ש-RelativeLayout יורש מ-ViewGroup, ובו הפונקציה. בדוגמה מוצגים שישה ילדים.childCount קוראים ל-getChildAt(i) ומקבלים View. אפשר להציג את השם עם getClass().getSimpleName() כדי לראות את סוגי הרכיבים.LinearLayout אנכי עם השאלה Which of the following programming technologies do you know?, ובתוך LinearLayout פנימי שלושה CheckBox (HTML, CSS ו-JavaScript). לחצן clear all צריך לבטל את הסימון של כולם בבת אחת, בלי לגשת לכל אחד בנפרד.LinearLayout הפנימי, ממירים כל אחד ל-CheckBox וקוראים ל-setChecked(false).TextView באותו Layout, האפליקציה קורסת, כי מנסים להמיר TextView ל-CheckBox. את השגיאה רואים בחלונית ההודעות: fatal exception ו-cannot be cast to checkbox, עם קישור שמוביל לשורה שגרמה לחריגה.View, בודקים child instanceof CheckBox, ורק אז ממירים ומבטלים סימון.LinearLayout זה בתוך זה, getChildCount ו-getChildAt מחזירים רק את הילדים הישירים, ולכן הקוד הקודם לא מספיק.uncheckAllCheckBoxes(ViewGroup parent). בלולאה על ילדיה: אם הילד CheckBox, מבטלים סימון. אם הוא ViewGroup, הפונקציה קוראת לעצמה איתו. המרצה ממליץ ללמוד רקורסיה למי שלא מכיר.findViewById(android.R.id.content) ולשלוח אותו לפונקציה.הטקסט המלא של הדקות הראשונות בהרצאה «View Group» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
כל רכיבי ה-Layout יורשים את אותה מחלקת בסיס בשם View Group. View Group זאת מחלקת הבסיס של כל רכיבי ה-Layout ושל רכיבים נוספים שמאפשרים לשים בתוכם Child Elements.
אז בואו נראה מה זה ה-View Group ואיך אנחנו יכולים להשתמש במחלקה הזאת בפרויקטים שלנו. יש לנו פה איזשהו Layout של Relative וסתם אני זורק כאן כל מיני רכיבים בכדי לבצע איזושהי בדיקה לגביהם בקוד.
אז יש לנו פה כל מיני רכיבים, יש לנו פה איזשהו לחצן, בואו ניגש ללחצן הזה, נבצע אירוע onClick, ButtonShowInfo נקרא לזה, ויש לנו כאן את ה-TextView הזה, ואנחנו רואים שיש לו ID, TextView, בואו נשנה את ה-ID ל-TextViewInfo.
כעת נחזור, ניגש ונייצר אירוע בקוד Java, ואנחנו יכולים עכשיו לגשת ולקבל אינפורמציה לגבי ה-child elements של ה-layout. ראשית, יש לנו פה relative layout ונגדיר כאן איזשהו ID עבור ה-layout הזה.
נקרא לזה relative layout main. ניגש לקוד, ניצור כאן relative layout, נאתר אותו, mindviewbyid, ir.id.relativeLayoutMain וכעת בואו נראה כמה דברים מעניינים לגביו.
יש לנו פונקציה שנקראת getChildCount. הפונקציה הזאת מחזירה לנו את מספר ה-childs שקיימים עבור אותו layout. אם אנחנו מסתכלים אנחנו רואים שה-relativeLayout כמחלקה, אם אנחנו לוחצים קונטרול ומרחפים מעל, אנחנו יכולים בעצם לראות שהיא יורשת את view group אפשר לראות פה extends of view group ואם אנחנו לוחצים
עליה אנחנו ממש מגיעים ל-relative layout ואנחנו רואים שהיא יורשת את view group ל-view group יש את הפונקציה הזאת שנקראת get child count ולכן לכל layout יש אפשרות לדעת כמה ילדים יש לו בואו נראה הפונקציה הזאת מחזירה לנו integer נקבל אותו ואנחנו רוצים להציג אותו לצורך כך בואו בואו ניגש וניקח את ה-ID של ה-TextView ונייצר כאן Private TextView עם ה-ID הזה.
ניגש ונאתר אותו בצורה כזאת וכעת ניגש אליו, Set Text ונכניס Child Count בצורה כזאת. בואו נריץ, הנה האפליקציה רצה, בואו נלחץ על הרחצן ונראה שהוא אומר שיש לנו שישה ילדים, 2 3 4 5 6 בדיוק שישה ילדים אוקיי עכשיו בואו ניגש ונקבל את הילדים עצמם איך אנחנו יכולים לעשות את זה נרוץ בלולאה
i שווה 0 i קטן מ-child count אנחנו רוצים לקבל את ה-child אז בואו ניקח פה משתנה view וניגש ל-layout relative layout מיין ויש לנו את הפונקציה get child at אם אנחנו נותנים לה את האינדקס אז היא מביאה לנו את ה-view הזה בואו נקרא לזה v כי כבר יש לנו פה view כעת אנחנו יכולים לגשת ולייצר איזושהי מחרוזת להצגה בואו ניקח string
message דיר בהתחלה את ה-child count במסג' עם איזושהי ירידת שורה וכעת נבוא למסאג', נכניס את v.get+2-string ונציג את המסאג' בלבד. בואו נריץ, נלחץ על הלחצן ואנחנו רואים שיש לנו פה את הפריטים עצמם, קצת לא רואים את זה טוב כי חסר לנו פה ירידת שורה.
במקום 2-string בואו נקרא למשהו קצת יותר פשוט get simple name, זה לנו רק את השם של הרכיב עצמו. בואו נריץ, נלחץ על הלחצן ואנחנו רואים שיש לנו פה ממש השגה של הטיפוסים עצמם שיש איך אנחנו יכולים להשתמש עכשיו בנתון הזה איך אנחנו יכולים להשתמש בטיפוסים עצמם או במספר שלהם עבור לייאוט מסוים אז ברור ראשית ניפטר מכל אלה
ונשנה את זה לליניאר לייאוט בכדי להראות כאן איזה שהוא עיצוב פשוט נוריד את זה זה ואת זה נגדיר שהלייאוט שלנו הוא ורטיקל נגדיר לו איזשהו איי-די שיהיה ליניאר לייאוט מיין ובואו נבקש מהמשתמש על ידי טקסט view את הדבר הבא which of the following programming technologies do you know נגדיר כאן טקסט סייז
20 sp נגדיר כאן טקסט tile bold בצורה כזאת, עכשיו בואו ניקח פה עוד linear layout ניתן לו wrap content ניתן לו תכונת margin 10dp background כלשהו נגדיר אותו כוורטיקל וניתן לו איזה אדינג מסוים רק בשביל האסתטיקה עכשיו בתוכו נגדיר סדרה של צ'קבוקס יש לנו פה צ'קבוקס ראשון wrap content בעל הטקסט html
יש פה טקסט בוקס שני ושלישי, יש לנו פה את שפת CSS שהיא העיצוב של טכנולוגיית ה-Web ויש לנו פה JavaScript גם כן שפת Web שמורצת על ידי דפדפנים.
אוקיי עכשיו אנחנו רוצים שהיוזר בעצם יסמן לנו איזה שפת תכנות הוא יודע. בנוסף אנחנו רוצים שיהיה לנו כאן איזשהו לחצן שמאפשר לנו לאפס את כולם בבת אחת ובואו ניקח פה text clear all בואו ניקח כאן text all caps false נגדיר כאן שהלייאוט גרוויטי סנטר אוריזונטל נמצא לנו באמצע וניתן לו איזה שהוא קליק בטון clear all on click בצורה כזאת
כעת אנחנו רוצים בלחיצה על הלחצן להגדיר שכל הטשקבוקסים האלה יהיו בעלי צ'ק פולס בבת אחת ואנחנו לא רוצים לגשת לאחד אחד ולבצע את זה כי יכול להיות שבהמשך יהיה לנו יותר יכול להיות שיהיה איזשהו טופס שיש בו כבר הרבה אנחנו לא רוצים לעבור אחד אחד אנחנו רוצים לעשות את זה בבת אחת אז מה אנחנו צריכים לעשות אז אנחנו צריכים לעשות את מה שעשינו מקודם בואו ניקח את השורה הזאת נשים אותה פה
ועכשיו אנחנו יודעים כמה ילדים יש ל-Layout, רק אנחנו צריכים להחליף כאן ולאתר את ה-Layout הספציפי שאנחנו מדברים עליו. אז הנה ה-LinearLayout השני, בואו ניתן לו פה ID, נקרא לו Inner, נקרא לו LinearLayoutInner, ניגש ונאתר אותו, LinearLayoutInner, נאתר אותו כאן, כאשר את הקודם אנחנו בכלל לא צריכים,
לא את זה ולא את זה, אז ניפטר מהם. אוקיי, עכשיו מה אנחנו רוצים לעשות? יש לנו כאן את ה-childCount אנחנו רוצים לרוץ בלולאה מ-0 כל עוד i יותר קטן מ-childCount i++ ומה שאנחנו רוצים לעשות אנחנו רוצים לגלות view כלשהו בצורה כזאת אבל אנחנו יודעים שה-view הזה הוא מסוג checkbox
כי בתוכו יש checkbox והוא רק נקרא לזה בשם המתאים ויהיה linear layout inner נשים את זה כאן וכאן ואנחנו יכולים כבר להיפטר מכל הקוד הקודם שהיה רק לצורך הדגמה של שתי הפונקציות האלה get child count שמוביל לי את מספר ה-child שיש בתוך ה-view group ו-get child at שמחזיר לי את ה-view הספציפי בעל האינדקס הזה.
אז אנחנו יכולים כבר כאן לבצע צ'קבוקס ולעשות לו איזשהו קאסטינג לצ'קבוקס. אם יש לנו את הצ'קבוקס אז אנחנו יכולים to set checked false וזה בעצם קוד שרץ על כל הרכיבים הפנימיים של ה-layout הזה ומוריד את כולם ל-false.
בואו נריץ את זה, נסמן חלק מהם, נבצע clear all ואנחנו רואים שהמערכת הורידה אותם בבת אחת, את כולם.
יכול להיות לי פה גם מספר רב של צ'קבוקסים ובבת אחת הורדנו את כולם בגלל שרצנו על ה-view group הזה שעוטף אותם קיבלנו את כל אחד מהם ועשינו עליו איזושהי פעולה דרושה שכרגע זה ביטול ה-v של הצ'קבוקס.
אבל קיימת פה איזושהי בעיה קלה מה קורה אם בתוך ה-layout הזה יש עוד משהו שהוא לא צ'קבוקס לדוגמה בוא ניקח כאן טקסט view ונגדיר שהטקסט שלו זה Web Client.
נניח שזה בעצם רכיבים או שפות תכנות ליתר דיוק שמתעסקות בצד לקוח בעולם ה-Web. בואו רק נגדיר שהטקסט סייז 20 ושיש לנו Layout Gravity Center Horizontal שזה יהיה כזה בדיוק באמצע בצורה כזאת.
עכשיו אם אנחנו באמת מריצים את האפליקציה האם הכל עובד כמו שצריך שימו לב בתוך ה-LinearLayout יש לנו גם טקסט ויו וגם צ'קבוקס בואו נריץ את זה קודם כל נסמן פה מספר v's נלחץ על הלחצן והאפליקציה קורסת הייתה פה איזושהי בעיה במידה והאפליקציה קורסת הדבר הנכון לעשות זה לא לגעת בהודעה