
menu_send, עם פריטים של אימייל, SMS ו-WhatsApp.registerForContextMenu עם ה-View שעליו לחיצה ארוכה תפתח את התפריט. אפשר לרשום את ה-layout, וגם כפתור.onCreateContextMenu, מקבלים getMenuInflator() ומנפחים את התפריט לתוך אובייקט ה-ContextMenu שהתקבל. התפריט מופיע באמצע המסך, ונסגר בבחירה או בלחיצה מחוץ אליו.onContextItemSelected ועושים switch לפי item.getItemId(), למשל הצגת Toast לכל פריט.onCreateContextMenu בודקים v.getId(): אם זה כפתור ה-Send מנפחים את menu_send, אחרת את תפריט הצבעים menu_colors.setHeaderTitle ול-setHeaderIcon.checkableBehavior מסוג all על group מציגה צ'קבוקס ליד כל פריט, אבל הסימון לא נשמר. הסיבה: תפריט הקשר נוצר מחדש בכל פתיחה, בניגוד לתפריט אפשרויות שנוצר פעם אחת. לכן בכל יצירה קוראים את צבע הרקע של ה-layout: מקבלים getBackground() כ-Drawable, בודקים instanceof ColorDrawable ולוקחים getColor(). לפי הצבע קוראים ל-findItem על התפריט שכרגע נוצר ומסמנים setChecked(true). שמירה של הפריט במשתנה גלובלי לא עוזרת, כי האובייקט נוצר מחדש.registerForContextMenu(view)onCreateContextMenu ו-onContextItemSelectedהטקסט המלא של הדקות הראשונות בהרצאה «Context Menu» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
הסוג הבא של התפריט שקיים לנו נקרא context menu. context זה תלוי הקשר. context menu זה תפריט שמוצג רק כאשר אנחנו לוחצים לחיצה ארוכה, כלומר long click.
לדוגמה אם אנחנו לוחצים long click על האקטיביטי ואנחנו רוצים שיוצג כתוצאה מכך תפריט, אנחנו יכולים להגדיר את זה. והסוג של התפריט הזה זה context menu ולא options menu שדיברנו עליו לפני זה שהוא תפריט שמוצג רק כאן למעלה.
אז בואו נראה איך אנחנו מציגים context menu. הדבר הראשון שאנחנו צריכים לעשות זה לבנות את ה-menu. כאן זה מאוד דומה למה שעשינו מבחינת ה-options menu וזה פשוט מאוד ליצור תיקייה בתוך res שקשורה ל-menus בואו נצרף
android resource directory נבחר menu אוקיי ובתוך התיקייה הזאת אנחנו מצרפים קובץ בואו נקרא לו מניו ובואו ניקח לדוגמה send בכדי לשלוח כל מיני פריטים שונים כתלות בלחיצה על התפריט אז בואו נצרף את זה ניגש לתפריט ונגדיר את הפריטים השונים דומה למה שהיה לנו לפני זה בואו ניקח אייטם נגדיר לאייטם ID מניו אייטם אימייל בואו ניתן לו טייטל אימייל בואו נשכפל את זה ניקח עוד
אחד של send sms והאחרון וואטסאפ והנה הגדרנו תפריט שמאפשר לבצע שליחה של אימייל של sms או של וואטסאפ בדומה למה שעשינו באופשונס מניו אוקיי אבל אנחנו לא רוצים להציג את התפריט הזה באופשונס מניו אנחנו רוצים להציג אותו כאשר לוחצים לחיצה ארוכה לדוגמה על האקטיביטי.
אז איפה עושים את זה? כאן אנחנו צריכים לגשת למיין אקטיביטי ולבצע את הדברים הבאים. דבר ראשון אנחנו רוצים להירשם לקונטקסט מניו.
יש לנו כאן את האובייקט של המיין אקטיביטי. אם נסתכל על המיין אקטיביטי שלנו אז אנחנו יכולים לראות שזה רלטיב לאאוט הפעם ויש לה איידי שנקרא רלטיב לאאוט מיין ומה שעשינו במיין אקטיביטי זה יצרנו פה את האובייקט ומצאנו אותו ועכשיו בתוך הרלטיב לאאוט מיין יש לנו את האובייקט של הלאאוט עצמו
אז מה שאנחנו רוצים לעשות זה לקרוא לפונקציה שנקראת רג'יסטר פור קונטקסט מניו רג'יסטר פור קונטקסט מניו זה פונקציה שאומרת לנו טוב לאיזה view אתם רוצים שאני ארשם בואו ניתן את ה-view relative layout main וזה בעצם גורם לקונטקסט מניו בעצם להיפתח ברגע שלוחצים long click על האקטיביטי.
הדבר הבא שאנחנו צריכים לעשות זה לדרוס פונקציה שנקראת on create context menu ומה שאנחנו רוצים פה זה לעשות משהו דומה למה שעשינו בעבר וזה לנפח את התפריט.
בואו ניקח מניו inflater, get מניו inflater, מניו inflater נקודה inflate, ואנחנו רוצים לתת לו r, בתוך r יש לנו מניו, ובתוך המניו יש לנו את המניו send שאנחנו רוצים.
הדבר הבא שאנחנו רוצים לתת זה את אובייקט ה-context מניו שקיבלנו לכאן לפונקציה, מניו בכדי שהיא תנפח את ה-XML בתוכו. כעת בביצוע לונג קליק על ה-Activity המניו אמור להיות מוצג.
בואו נריץ ונבדוק את זה. נלחץ לונג קליק על ה-Activity והנה אנחנו רואים את התפריט שביצענו, מוצג בדיוק באמצע, לא כאן למעלה כמו ה-Options מניו.
אנחנו יכולים לבחור פריט והוא סוגר אותו. בואו נלחץ עוד פעם לונג קליק. בחירה מחוץ לפריט גם סוגרת אותו ואנחנו עכשיו ורוצים לטפל במצב שהמשתמש בוחר באופציה מסוימת.
אז כאן אנחנו צריכים לחזור ולדרוס פונקציה נוספת, והפונקציה הנוספת שאנחנו צריכים לדרוס נקראת onContextItemSelected. כאשר היוזר בוחר איזשהו פריט ברשימה, מה אנחנו רוצים לבצע?
אז אנחנו צריכים לבצע פה משהו דומה למה שעשינו, עשינו פה בעבר איזשהו סוויץ', אייטם זה הפריט שלחצו עליו, r.get itemid זה ה-id שלו וכעת אנחנו יכולים לבדוק מה ה-id שנשלח אלינו האם זה r.id. והיה לנו פה את האימייל ראשון אם כן בואו נציג איזשהו טוסט שאנחנו שולחים אימייל בואו נעשה פה רק
length long לאחר מכן נשכפל את זה ונטפל בשני המצבים האחרים יש לנו פה sms ויש לנו פה את וואטסאפ בואו נריץ שוב שוב פעם נבצע לחיצה ארוכה וכעת אם אנחנו בוחרים לדוגמה בסמס אנחנו רואים שהוא מבצע את הקוד בהתאם לחיצה ארוכה אימייל מבצע את הקוד בהתאם עכשיו
האם אנחנו חייבים רק את המיין אקטיביטי להירשם או האם אנחנו יכולים לקחת אפילו איזשהו לחצן לא קשור לכלום בואו נבדוק את זה בואו בואו ניגש ונייצר פה איזשהו בטון, נגדיר אותו כ-match parent, wrap-content, נגדיר עליו איזשהו טקסט, send, ניתן לו ID כי אנחנו רוצים לאתר אותו,
בטון send, וכל מה שאנחנו רוצים לעשות זה לאתר את הלחצן הזה דרך ה-ID שלו ולתת אותו כאן במקום ל-relative layout.
אז בואו נקרא פה ל-Find View by ID וניתן את בטון send. בואו נריץ נלחץ על הלחצן שימו לב שאני לוחץ עליו לא long click לא קורה שום דבר זה ממש לחיצות רגילות לגמרי אם אני עכשיו לוחץ ולא עוזב רק אז התפריט מוצג לנו זה context menu הוא מוצג אך ורק ב-long click על פריט ואנחנו רואים שהכל עובד כמו שצריך עכשיו מה קורה אם אנחנו רוצים להציג שני תפריטים שונים כתלות
ב-Long Click על שני רכיבים שונים. הרי מה שאנחנו רואים כאן ושנרשמנו לרכיב זה אחלה אבל בכל מקרה הפונקציה הזאת מתבצעת On Create Context Menu ויוצרת לנו תפריט אחד אז איך אנחנו יכולים בעזרת הפונקציה הזאת ליצור שני תפריטים שונים בואו נראה את זה יש יש לנו כאן את המיין אקטיביטי ומה שנעשה זה
טיפה נשנה את הלחצן הזה בכדי לבצע הפרדה בינו ובין לחצן אחר כך שכל לחצן יפעיל לנו תפריט שונה לגמרי אז לצורך הדוגמה בואו ניגש ונעשה אותו קצת יותר אסתטי בואו נגדיר שהרוחב שלו בעצם ב-80 dp וגם הגובה שלו נוריד ממנו את הטקסט הזה ובמקום הטקסט נשים עליו איזשהו background נלך לדרואובול ובדרובול יש לנו שם איזשהו אייקון של send כזה,
הגדרתי מקודם, ומה שאנחנו רוצים לעשות רק זה לתת לו align parent bottom true, align parent right true, כדי שהוא יהיה ימינה, ובואו ניקח את הלחצן הזה, נשכפל אותו ונגדיר לחצן נוסף עבור צבעים, קולורס לפט טרו ויש לנו שמה קולורס אז הנה אנחנו רואים שיש לנו כאן שני לחצנים ואנחנו רוצים שכל לחצן יפעיל לנו תפריט אחר לגמרי
אז אחרי שיש לנו את הלחצנים בואו ניגש ונייצר עוד קובץ תפריט נקרא לו מניו underline colors הפריטים שאנחנו רוצים לתת כאן זה פריטים עבור צבעים יש לנו אייטם בואו ניתן id מניו אייטם רד דומה למה שעשינו לפני זה ובואו ניקח טייטל רד נשך פרל יש לנו כאן גרין יש לנו כאן
בלו והנה יש לנו שני תפריטים אין ביניהם שום קשר מעולה הדבר הבא שאנחנו רוצים לעשות ולהגדיר איזה תפריט עולה על איזה רכיב או מוצג כשלוחצים long קליק על איזה רכיב אז אנחנו צריכים לחזור ל-Main Activity וכמו שנרשמנו ללחצן הראשון בואו נשכפל
את זה עם Ctrl D נירשם גם ללחצן השני שהיה Button Colors כעת כל אחד מהלחצנים יפעיל לנו את התפריט אבל בהפעלת התפריט הפונקציה הזאת מתבצעת כל פעם מחדש ואנחנו רואים שרק תפריט אחד מתבצע פה r.menu.menu send אז מה אנחנו צריכים לעשות כל מה שאנחנו צריכים לעשות זה בדיקה של if על הפונקציה של הרכיב הזה יש לנו פה רכיב שנקרא view v וזה בעצם מקבל את הלחצן שהפעיל אותו אז מה שאנחנו
צריכים לעשות זה פשוט לקרוא ל-v.getid ולבדוק האם אתה שווה ל-r.id.bd בטון סנד רק אם אתה שווה לבטון סנד זה אומר שכרגע לחצו על בטון סנד במידה ולחצו על בטון סנד זה התפריט שאני רוצה לנפח אם לחצו על תפריט אחר על רכיב אחר ליתר דיוק אז אנחנו רוצים לנפח את התפריט השני בואו ניקח ונשכפל את זה
לפה ונגדיר שאנחנו רוצים את מניו כלורס בואו נבדוק אנחנו כבר יכולים לראות למטה את שני הלחצנים לחיצת long click על הראשון נותנת לנו את התפריט של האימייל sms ווואטסאפ אנחנו יכולים לבחור ולראות שזה עובד לחיצה על הלחצן השני פותחת לנו red green blue ולא עשינו שום דבר עדיין אז בואו ניגש ונשכפל כאן גם את האופציות של רד גרין בלו בואו ניגש ונעשה
אופציה אחת לרד ואנחנו לא רוצים להציג טוסט אנחנו רוצים להציג אנחנו רוצים לגשת ל-relative layout men set background color color.red בואו נשכפל את כל זה עוד פעמיים ניגש לגרין גרין ולבסוף יש לנו בלו ובואו נבדוק נריץ נלחץ על הלחצן של הצבעים לחיצה ארוכה נבחר ברד עובד לחיצה ארוכה גרין לחיצה ארוכה בלו לחיצה ארוכה על הסנד כל עובד כמו שצריך
רק שימו לב שעדיין אין לנו פה את הצ'קבוקס המעניינים האלה שהיו לנו כשעבדנו על האופצ'נז מניו אז בואו בזריזות נוסיף אותם ונזכר איך זה היה הנה יש לנו פה את המניו colors ומה שעשינו זה עטפנו בגרופ את הכל בכדי להגדיר בבת אחת