
new PopupMenu(this, view), כשה-View הוא הרכיב שלידו התפריט יוצג, בדרך כלל הכפתור עצמו. אחר כך קוראים ל-inflate עם R.menu.menu_send (או תפריט הצבעים) ול-show.setOnMenuItemClickListener ונותנים this. כך פונקציה אחת משרתת את שני התפריטים, בלי לכתוב טיפול כפול במחלקה אנונימית.OnMenuItemClickListener (Alt+Enter), ובפונקציה onMenuItemClick עושים switch לפי item.getItemId(): צביעת הרקע בצבע, או Toast לאימייל, SMS ו-WhatsApp.show מקבלים את התפריט עם popupMenu.getMenu(). קוראים את צבע הרקע (Drawable, בדיקת instanceof ColorDrawable, getColor) ומסמנים בעזרת findItem(...).setChecked(true). אין שמירה גלובלית של הפריטים, כי הקוד רץ בכל לחיצה.true, ואם לא, false, כדי שמאזין אחר יוכל לקבל אותו. בפועל מחזירים true בכל case שטופל ו-false בסוף.הטקסט המלא של הדקות הראשונות בהרצאה «Popup Menu» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
סוג התפריט השלישי שאנחנו הולכים לראות נקרא Pop-up Menu. Pop-up Menu זה תפריט שניתן להציג אותו ליד כל רכיב שאנחנו רוצים, באיזה אירוע שאנחנו רוצים.
אם Options Menu הוצג אך ורק על ידי לחצן פה למעלה באקשן בר, ו-Context Menu הוצג רק כאשר לחצו לחיצה של לונג קליק על איזשהו תפריט והוצג באמצע, אז פופ-אפ מניו אנחנו יכולים להחליט מתי בדיוק להציג אותו וליד מי להציג אותו כלומר יש פה גמישות הרבה יותר גדולה לגבי מתי הוא יוצג ואיפה הוא יוצג אז הרבה
פעמים פשוט אוהבים להשתמש בפופ-אפ מניו בשביל להחליט אוקיי לוחצים על איזשהו רכיב מסוים והוא מוצג לידו יש לנו כאן את אותה תוכנית קודמת שביצענו לגבי הקונטקסט מניו אבל ניקיתי אותה מקוד הג'אווה ורק השארתי את הרכיבים הוויזואליים שהיו בלייאוט ואת התפריטים
היו לנו שני לחצנים אחד שמאפשר להציג תפריט שמבצע פעולות של סנד השני מאפשר להציג תפריט שמבצע פעולות של צביעת צבע רקע ויש לנו פה בדיוק שני תפריטים שהיו לנו מקודם יש לנו פה את המניו סנד יש לו שליחה של אימייל סמ"ס ווואטסאפ יש לנו תפריט של קולורס והוא מאפשר לצבוע ברד גרין ובלו ואנחנו רוצים במקום להציג אותם כקונטקסט הפעם,
להציג אותם כפופ-אפ. אז איך עושים את זה? אז להציג את התפריט זה מאוד פשוט. בואו ניגש לאירוע של לחצן הסנד, ניגש לקוד שלו, אלט אנטר, והנה יש לנו את הקוד של לחצן הסנד, ומה שאנחנו רוצים לעשות זה לבנות אובייקט מטיפוס פופ-אפ מניו.
נגדיר new, פופ-אפ מניו, ואנחנו רואים שהקונסטרקטור אומר לנו, תנו לי בבקשה קונטקסט בכדי שיהיה לי שירותים שקשורים לקונטקסט אנחנו יכולים לתת לו את הדיס ותנו לי בבקשה איזה שהוא view שלידו אתם רוצים שאני יוצג.
בואו ניתן לו בדיוק את אותו רכיב שאפעיל אותו. לדוגמה כאן אנחנו רואים שהלחצן שולח את עצמו לאירוע onclick אז אנחנו יכולים לקחת ולתת בדיוק את הלחצן הנוכחי ואז התפריט יוצג ממש לידו.
לאחר מכן אנחנו רוצים to inflate אז בואו ניגש לפונקציית inflate ואז הוא אומר לנו איזה תפריט מרשימת התפריטים שיש לכם בדיוק אתם רוצים שאני אציג.
בואו ניתן לו את r בתוך r יש לנו תיקיית מניו ובתוך תיקיית מניו יש לנו בדיוק את התפריט מניו send. הדבר הבא שאנחנו צריכים לעשות זה popup menu.show וזה מציג את התפריט. בואו נבצע את אותו הדבר על הפונקציה השנייה אנט אנטר אנטר נעתיק את שלושת השורות נדביק אותם כאן נשנה את הסוג של התפריט to inflate ממניו
colors ובואו נריץ אז אם אנחנו באים ולוחצים על אחד הלחצנים אנחנו רואים את התפריט פופ אפ מניו ממש מוצג לידו אנחנו יכולים לבחור אחד מהפריטים אבל כמובן שלא כתבנו שום קוד שיתבצע כתוצאה מהלחיצה הזאת בואו נלחץ על השני ונראה שממש לידו מופיע התפריט ואנחנו יכולים גם כאן לבחור אבל לא כתבנו קוד שהתבצע כתגובה ללחיצה.
אז בואו נחזור ונכתוב את אותו קוד שהתבצע כתגובה ללחיצה של היוזר והנוהל הוא פשוט רישום דינמי ללחיצה על ידי מנגנון הליסנר שלמדנו בנושא הליסנר דיזיין פאטר.
וזה אומר שלפופ אפ מניו קיימת פונקציה שנקראת set on menu item listener on menu item click listener והיא אומרת לנו תביאו לי בבקשה איזשהו אובייקט שמממש את האינטרפייס on menu item click listener ואני בעצם אקרא לפונקציה שנמצאת שם.
כאשר היוזר לוחץ על פריט אני אקבל את האירוע הזה אני אדווח לכם אותו ותעשו מה שאתם רוצים כתגובה ללחיצה. הכי פשוט זה לתת את ה-dis, כלומר את האובייקט הנוכחי של המחלקה Main Activity, כי אז אנחנו יכולים להשתמש בדיוק עם הפונקציה הזאת גם בתפריט הראשון וגם בתפריט השני.
אם היינו משתמשים פה במחלקה אנונימית, אז היינו צריכים לבנות פעמיים את הטיפול בלחיצה, כאשר כאן אנחנו כותבים אותו פשוט פעם אחת. למה אנחנו מקבלים שוב שגיאה?
מפני שהמחלקה מיין אקטיביטי עדיין לא מימשה את האינטרפייס אז בואו נלחץ על אלט אנטר נבחר ב-Make Main Activity Implement On-Menu Item Click Listener אני בוחר את זה אנחנו רואים שהוא אומר לנו יש לנו פונקציה אחת On-Menu Item Click שמקבלת פריט שנקרא אייטם מסוג מניו אייטם שזה כמובן הפריט שנלחץ בואו
נוריד את ה-Directive Override אוקיי והנה עכשיו המיין אקטיביטי מממשת את האינטרפייס on menu item click listener הנה הפונקציה שתתבצע כשהיוזר לוחץ על פריט בתפריט וזה לא משנה באיזה תפריט בשני התפריטים האלה נרשמנו לאותה הפונקציה ואנחנו מקבלים את ההודעה בכל אחד
מהתפריטים מה אנחנו צריכים לעשות בפונקציה בואו נעשה פה פוויץ' דומה למה שעשינו בעבר גט אייטם איידי הנה אנחנו מקבלים את האיידי של התפריט שנלחץ ונתחיל לבצע קייסים במידה והאיידי הוא מניו אייטם רד אז אנחנו רוצים לגשת ללייאוט שלנו וטו סט בקראנד קולור בואו נבחר קולור נקודה רד ונבצע ברייק נשכפל את הקוד הזה
גם עבור גרין וגם עבור בלו ויש לנו עכשיו לבצע את הקוד עבור התפריט השני. עבור התפריט השני אנחנו רוצים את r.id.menuItemEmail במידה וזה קורה בואו נציג כרגע איזשהו טוסט שאומר E-Mail דומה למה שעשינו מקודם יש לנו כאן LengthLong נטפל את זה פעמיים הבא בתור זה עבור sms והאחרון
היה עבור וואטסאפ בואו נבדוק בואו נלחץ על לחצן הסנד הנה יש לנו את האימייל אני לוחץ על האימייל ואנחנו רואים שהקוד מתבצע כתגובה על הקליק בדיוק בתפריט הנכון קיבלנו את התפריט לפונקציה בדקנו מי נלחץ ולפי זה עשינו את הקוד הנכון בואו נלחץ על תפריט הצבעים נבחר רד אנחנו רואים שהכל צבוע גרין
כל צבוע ובלו הכל צבוע אנחנו אבל צריכים עדיין לטפל בצ'קבוקסים והטיפול בצ'קבוקסים כאן הוא טיפה שונה מהטיפול הקודם שביצענו כאן אנחנו צריכים לפני שאנחנו מציגים את התפריט כאן של הצבעים אנחנו צריכים לבוא ולקבל את אובייקט המניו אובייקט המניו ניתן להשגה על ידי popup menu.get menu
אחרי שיש לנו את אובייקט המניו אנחנו יכולים לבצע פעולות בשביל להגדיר את ה-checkable המתאים. אז איך עושים את זה? קודם כל אנחנו רוצים לדעת מה בעצם הצבע הרקע של ה-activity.