
menu_main (אותיות קטנות וקו תחתון בלבד). בו מגדירים item לכל פריט עם title, למשל Search, Favorites ו-Settings.onCreateOptionsMenu, מקבלים getMenuInflator() וקוראים ל-inflate עם R.menu.menu_main ועם אובייקט ה-Menu שהתקבל.onClick על הפריט ב-XML, או לדרוס את onOptionsItemSelected ולעשות switch לפי item.getItemId(). כשיש onClick ב-XML, הוא מתבצע במקום הפונקציה הדרוסה, ולכן עדיף להישאר עם שיטה אחת.always מציג את הפריט תמיד באקשן בר, ו-ifRoom מציג אותו רק אם יש מקום. Android Studio מציעה להחליף בתכונה עם namespace של app, ואפשר לקבל זאת ב-Alt+Enter.icon מתיקיית drawable. אייקון מוצג רק כשהפריט מוצג באקשן בר.checkable, ובקוד קוראים ל-setChecked(true) על הפריט שנבחר, ו-false על האחרים כדי שיישאר סימון אחד. את הפריטים מאתרים עם findItem בתוך onCreateOptionsMenu, ולא ב-onCreate, כי שם התפריט עדיין לא קיים.group עם id מאפשר להסתיר או להציג פריטים יחד, ועם checkableBehavior מסוג all אין צורך לסמן כל פריט בנפרד. תת-תפריט נבנה מ-item שבתוכו אובייקט menu עם פריטים משלו.android:checked="true" מסמן פריט כבר בהתחלה.findItem(R.id.menu_item_red) מחזיר את ה-MenuItem לפי id.onCreate או שמירה כמשתנה של האקטיביטי לא עובדים לפני יצירת התפריט.הטקסט המלא של הדקות הראשונות בהרצאה «Options Menu» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו מגיעים לסדרת סרטונים שבה אנחנו הולכים לראות איך ניתן באפליקציית אנדרואיד להציג תפריט מניו. יש כל מיני סוגי תפריטים ואנחנו הולכים לראות בסרטון הזה סוג אחד שנקרא Options Menu.
Options Menu זה תפריט שמוצג בפס הזה באקשן בר כאן בצד ימין או בצד שמאל תלוי אם האפליקציה היא right to left או left to right. אז בואו נראה איך עושים את זה.
הדבר הראשון שאנחנו צריכים לעשות זה להגדיר את התפריט עצמו. התפריט עצמו מוגדר בקובץ XML בתיקייה שנקראת מניו. אנחנו צריכים לגשת לתיקיית ה-resources, לצרף android resource directory, לבחור ברשימה כאן מניו, אוקיי, והנה יש לנו כבר תיקייה
מיוחדת עבור כל הגדרות התפריטים שיכולים להיות לנו. בתיקייה הזאת אנחנו מצרפים קובץ XML menu resource file, בואו נקרא לו menu.
underline main שוב כל האותיות אותיות קטנות מותר קו תחתון אסור אותיות גדולות נבצע אוקיי יש לנו קובץ xml ופה אנחנו רוצים להגדיר את הפריטים השונים של התפריט לכל פריט בואו ניתן טייטל ונגדיר לדוגמה שהפריט הראשון זה search נניח אנחנו רוצים לבצע איזשהו חיפוש מסוים אז יש לנו כאן אפשרות לחיפוש בואו נגדיר עוד
אחד שהאופציה שלו תהיה חייבריטס והאחרון סטינגס כל אחד מהם כאילו אמור לפתוח חלון חדש לפתוח חלון חדש ואנחנו רוצים להציג את זה כתפריט אם אנחנו עכשיו מריצים את האפליקציה אנחנו עדיין לא רואים את התפריט עצמו למה מפני שהגדרנו הקובץ xml משהו היה חייב לקחת את הקובץ הזה ולנפח אותו בכדי ליצור רכיב ויזואלי בדיוק
כמו שבעבר ניפחנו ליהאוט על ידי רכיב ליהאוט אינפלייטר ואז יכלנו באמת ליצור איזשהו רכיב ויזואלי שמכיל את הקובץ XML של הליהאוט, כך אנחנו צריכים לבצע את אותו הדבר עבור התפריט.
אבל זה לא נקרא ליהאוט אינפלייטר, זה נקרא מניו אינפלייטר. איפה עושים את זה? אז אנחנו צריכים לחזור למיין אקטיביטי ולדרוס כאן פונקציה שנקראת onCreateOptionsMenu.
דרסנו את הפונקציה הזאת, וממש לפני שאנחנו מחזירים ערך אנחנו רוצים לנפח את התפריט. הפונקציה מקבלת אובייקט מניו שלתוכו אנחנו צריכים לנפח את קובץ ה-XML.
אז אנחנו ראשית צריכים ליצור אובייקט מסוג מניו Inflator ולהכניס לתוכו את Get Menu Inflator בדיוק כמו שבעבר היה לנו פונקציה שנקראת Get Layout Inflator שאפשר לנו לקבל אובייקט מסוג Layout Inflator בכדי לנפח ליאאוט לתוכו, ככה יש
לנו את get מניו אינפלייטר והוא עושה את אותו הדבר עבור xml של ליאאוט. לתוך הלייאאוט אינפלייטר או יותר דיוק לתוך המניו אינפלייטר אנחנו רוצים inflate את הקובץ xml, הקובץ xml נקרא r.menu כי הוא נמצא בתוך המניו וקראנו לו מניו מיין.
אנחנו צריכים לתת גם את רכיב המניו שקיבלנו לפונקציה והנה יש יש לנו פה את הקוד שפשוט מנפח את קובץ ה-XML הזה לתוך המניו של האפליקציה וכך הוא יהיה מוצג.
בואו נריץ, הנה אנחנו רואים את התפריט, נלחץ עליו ובדיוק מה שהגדרנו קיים כאן, אבל אנחנו רוצים גם שהתפריט הזה יגיב ויבצע קוד כתגובה ללחיצה.
אז יש שתי אפשרויות לביצוע. אפשרות ראשונה לגשת לתפריט ולבחור את onclick. בואו ניתן לו search onclick alt enter enter נציג פה איזשהו toast long בצורה כזאת נריץ נלחץ על התפריט נבחר search ונראה למטה שהוא מוצג אם אנחנו לופצים על אחד אחר כמובן שלא כתבנו אירוע עבורם אז לא קורה כלום רק
הsearch מבצע לנו את הקוד שכתבנו זאת האופציה הראשונה אופציה נוספת שקיימת לנו זה לדרוס את onOptionsItemSelected זאת פונקציה שאוטומטית מופעלת בכל בחירה של פריט בתפריט מה אנחנו צריכים לעשות בפונקציה הזאת אנחנו צריכים לבצע איזשהו סוויץ' לבחור את האייטם האייטם
זה המשתנה שיתקבל לפונקציה וזה בעצם המניו אייטם של כל אחד מהפריטים שנבחרו כל אחד מהפריטים זה אובייקט מסוג מניו אייטם בואו נקרא לפונקציה שנקראת get item ID ולפי ה-ID אנחנו יודעים איזה פריט נבחר.
לצורך כך אנחנו צריכים לגשת ולתת ID. אם אין לי צורך ב-ID אני לא נותן ID אבל במקרה הזה אנחנו כן רוצים ID. בואו נקרא לזה menu item search. ניגש וניתן לכל אחד ID. זה יהיה menu item favorites ואחרון יהיה ID. menu אייטם סטינגס נחזור בחזרה יש לנו קייס rid menu item search אנחנו רוצים להציג כאן איזשהו טוסט בואו ניקח את הטוסט הזה ונשים אותו פה נצא
החוצה על ידי ברייק נשכפל את הקייס הזה לעוד שלושה חבר'ה פייבוריטס והאחרון היה סטינגס אוקיי סתם שלושה פריטים שהמצאתי כרגע והשאלה היא איזה פריט ייבחר אם אנחנו לוחצים על ה-search אם אנחנו לוחצים על ה-search אז האם הפונקציה הזאת תתבצע האם הפונקציה הזאת תתבצע מפני ששתיהן מפעילות
את ה-search או האם שתיהן ביחד יתבצעו אז בואו נקרא ל-search הזה search1 ול-search הזה search2 נריץ נלחץ על התפריט נבחר ב-search ונראה ש-search2 התבצע ולא search1 שימו לב ש-search1 לא התבצע בכלל אחר אחד אחר ונראה שהוא באמת מתבצע כמו שצריך.
אז אם אנחנו דורסים את onClick הוא מתבצע במקום הפונקציה onOptionsItemSelected אם אין לנו דריסה של onClick אז הפונקציה onOptionsItemSelected מתבצעת ואנחנו יכולים לטפל בה באירוע אז בואו כרגע ניפטר מה-onClick הזה שאין לו שום צורך כרגע בואו נהיה אחידים נטפל
בכל הפעולות ב-onOptionsItemSelected ולכן אנחנו יכולים לחזור לקובץ ה-XML ולהיפטר מה-On-Click הזה. אפשרות נוספת שקיימת לנו זה האופציה Show as Action.
Show as Action מאפשרת לנו לדוגמה להציג את הפריט ב-Action Bar במקום בתפריט שמתנפח כאן. יש לנו לדוגמה את האופציה Always וזה אומר שאנחנו תמיד רוצים לראות אותו כאן ב-Action Bar. הנה אנחנו רואים את זה כאן.
בואו ניקח את האופציה הזאת, נעביר אותה גם favorites וכאן נגדיר if-room זאת אומרת רק אם יש מקום ויש מספיק רוחב אצל הטלפון של היוזר אז תציג לי אם לא אל תציג לי את זה.
אנדרואיד סטודיו עכשיו נותנת לנו פה איזושהי הערה שזה כבר הגדרה קצת מיושנת ויש איזושהי הגדרה אחרת שמחליפה אותה שנקראת app.show as action אבל אנחנו צריכים להגדיר בשביל זה XML ניימספייס אז אם נטייל כאן לאנשהו נמתין נראה שאנדרואיד נותנת לנו איזשהו קו ואז ברגע שיש קו מתחת אנחנו יכולים ללחוץ על אלט אנטר
והנה אנדרואיד סטודיו הוסיף לנו פה את ה-XML ניימספייס המתאים שפשוט מחליף את ההגדרה הזאת אז בואו ניקח את האפ ופשוט נשים את זה כאן זה מה שהם רוצים זה מה שנעשה בואו נריץ וכבר אנחנו יכולים לראות שהנה יש לנו פה את שני התפריטים אנחנו לוחצים עליהם ואכן הם מבצעים את הקוד מאחורה
וכאן הצגנו if room ולכן הוא לא מוצג לנו אז אנחנו רואים שהוא פה Settings עד כאן הכל בסדר מה בקשר לאייקונים האם תפריט יכול להציג אייקונים הרי התשובה כן אבל רק אם הוא מוצג פה למעלה לפחות בגרסת האנדרואיד הזו אז בואו ניגש לדסטופ נעתיק שלושה אייקונים שהכנתי נחזור לאנדרואיד סטודיו, נלך לדרואובל,
נדביק אותם ופשוט נגדיר כאן אייקון. והאייקון הראשון זה דרואובל סרצ'; האייקון השני זה דרואובל פייבוריטס והאייקון השלישי זה דרואובל ויש לנו את ה-settings.
הנה אנחנו רואים את שלושת האייקונים, בואו נריץ את זה. ובגלל שמוצגים עכשיו האייקונים אז פתאום יש מקום ואז שלושת האייקונים מוצגים ואין שום תפריט אינפלייטר מתנפח כאן.
בואו נלחץ עליהם ונראה שהם עובדים כמו שצריך. זאת אומרת ה-search, הנה ה-favorites, הנה ה-settings, הכל עובד כמו שצריך.
אפשרות נוספת שיכולה להיות שימושית עבור תפריט, זו האפשרות שהתפריט יהיה checkable עם checkbox לידו. מתי זה שימושי?
אם התפריט מתאר איזה משהו שמהרגע שלוחצים עליו הוא הופך להיות קבוע. לדוגמה הגדרת צבע רקע עבור האפליקציה שבחרנו צבע ומעכשיו זה הצבע באופן קבוע.
אז אנחנו יכולים להגדיר איזשהו צ'קבוקס כזה v שמסומן ליד התפריט ומעכשיו התפריט הזה מתאר שהבחירה היא קבועה. לצורך כך בואו ניגש ונעשה תפריט של שלושה צבעים נניח בואו ניתן להם ניקח מניו אייטם רד טייטל נגדיר רד נשכפל יש לנו פה גרין וניקח בלו אותם שלושה צבעים אנחנו
רוצים שהבחירה גם תבצע פעולה מסוימת ולכן אנחנו יכולים לגשת ולכתוב שברגע שבוחרים אותם אז הם כמובן עושים איזושהי בחירה של צבע בואו ניגש ונגדיר שאם אנחנו הולכים Red במקום להציג טוסט אנחנו רוצים לגשת ל-Linear Layout Main Set Background Color ובואו נבחר
Color Red זה האופציה הראשונה בואו נגדיר יש לנו בעצם השני היה גרין נשמור על אחידות כאן הנה יש לנו גרין ולבסוף בלו נצבע את זה בבלו אם אנחנו כרגע מריצים אנחנו יכולים לראות שאכן זה עובד אבל אין לנו שום v ליד נלחץ על התפריט נבחר ב-red אנחנו רואים שהוא עובד
green עובד blue עובד אף אחד מהם לא מסומן פה שמעכשיו והלאה זה הצבע תשימו לב שהסטינג חזר לכאן בגלל שיש לנו פה גם את התפריט שגם הוא תופס לנו קצת מקום אז אם אנחנו רוצים באמת לראות את שלושת האייקונים אז במקום if room פשוט נגדיר אותו always והוא תמיד יציג את שלושת האייקונים no matter what אוקיי איך
אנחנו מגדירים שהדבר הזה מכיל צ'קבוקס מה שאנחנו רוצים לעשות זה checkable הוא האם יש לידך איזשהו צ'קבוקס ברגע שעשינו את זה אוטומטית יהיה לידו צ'קבוקס בואו נריץ נבחר בתפריט ונראה שאכן ליד כל אחד יש צ'קבוקס אם אני לוחץ על הראשון אז הוא מסומן אבל הוא לא נשאר ככה ולמעשה
הוא גם לא כל כך מסומן כי הבחירה שלו עדיין לא מסמנת אותו אלא אנחנו צריכים דרך הקוד לבצע את הצ'ק עצמו אז בואו נעשה את זה. לצורך כך אנחנו צריכים להגיע ספציפית לרכיבים עצמם ולסמן אותם בקוד.