PracticU

Context Menu

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA › Context Menu
מילון מושגים:
רכיב - יחידת בניין עצמאית וניתנת לשימוש חוזר בתוך מערכת או ממשק משתמש, שאחראית על חלק מוגדר מהתפקוד.
View - רכיב שאחראי על הצגת המידע למשתמש (התצוגה) בדפוס MVC. גם טבלה וירטואלית מבוססת שאילתה במסד נתונים.
לייאאוט - ארגון וסידור הרכיבים החזותיים על המסך או בדף, כמו מיקום כפתורים, טקסט ותמונות.
כפתור - רכיב בממשק המשתמש שהמשתמש לוחץ עליו כדי להפעיל פעולה, כמו שליחת טופס או מעבר לדף אחר.
אובייקט - יחידה בתכנות מונחה עצמים שמאגדת נתונים (תכונות) ופעולות (מתודות). נוצר בדרך כלל ממחלקה המשמשת כתבנית.
משתנה - שם שמפנה למקום בזיכרון שבו נשמר ערך שיכול להשתנות במהלך ריצת התוכנית, כמו מספר, טקסט או אובייקט.

Context Menu
תפריט הקשר מוצג רק בלחיצה ארוכה על רכיב, ולא בראש המסך כמו תפריט אפשרויות. בשיעור בונים אותו, מטפלים בבחירה, מקשרים תפריטים שונים לרכיבים שונים, ומסמנים את הפריט הנכון.
איך בונים אותו
1. קובץ התפריט: יוצרים קובץ בתיקיית menu, למשל menu_send, עם פריטים של אימייל, SMS ו-WhatsApp.
2. רישום הרכיב: ב-MainActivity קוראים ל-registerForContextMenu עם ה-View שעליו לחיצה ארוכה תפתח את התפריט. אפשר לרשום את ה-layout, וגם כפתור.
3. יצירת התפריט: דורסים את onCreateContextMenu, מקבלים getMenuInflator() ומנפחים את התפריט לתוך אובייקט ה-ContextMenu שהתקבל. התפריט מופיע באמצע המסך, ונסגר בבחירה או בלחיצה מחוץ אליו.
4. טיפול בבחירה: דורסים את onContextItemSelected ועושים switch לפי item.getItemId(), למשל הצגת Toast לכל פריט.
5. שני תפריטים לשני רכיבים: רושמים כל כפתור בנפרד. בתוך onCreateContextMenu בודקים v.getId(): אם זה כפתור ה-Send מנפחים את menu_send, אחרת את תפריט הצבעים menu_colors.
6. כותרת ואייקון: על אובייקט התפריט קוראים ל-setHeaderTitle ול-setHeaderIcon.
צ'קבוקסים בתפריט הקשר
הגדרת checkableBehavior מסוג all על group מציגה צ'קבוקס ליד כל פריט, אבל הסימון לא נשמר. הסיבה: תפריט הקשר נוצר מחדש בכל פתיחה, בניגוד לתפריט אפשרויות שנוצר פעם אחת. לכן בכל יצירה קוראים את צבע הרקע של ה-layout: מקבלים getBackground() כ-Drawable, בודקים instanceof ColorDrawable ולוקחים getColor(). לפי הצבע קוראים ל-findItem על התפריט שכרגע נוצר ומסמנים setChecked(true). שמירה של הפריט במשתנה גלובלי לא עוזרת, כי האובייקט נוצר מחדש.
פקודות שמוצגות
- registerForContextMenu(view)
- onCreateContextMenu ו-onContextItemSelected
אחרי השיעור אפשר להציג תפריט הקשר בלחיצה ארוכה, לתת לכל רכיב תפריט משלו ולסמן בו את הבחירה הנוכחית.
השיעור הבא בקורס: Popup Menu

פרקי ההרצאה: Context Menu

  1. 00:00

    מהו Context Menu ולחיצה ארוכה

  2. 00:39

    יצירת קובץ תפריט עם פריטי שליחה

  3. 02:58

    רישום עם registerForContextMenu וניפוח התפריט

  4. 04:49

    טיפול בבחירה ב-onContextItemSelected

  5. 06:12

    הצגת התפריט בלחיצה ארוכה על לחצן

  6. 07:31

    שני תפריטים לשני רכיבים שונים

  7. 10:54

    בחירת התפריט לפי מזהה הרכיב

  8. 12:35

    שינוי צבע הרקע מתוך התפריט

תמלול ההרצאה: Context Menu

הטקסט המלא של הדקות הראשונות בהרצאה «Context Menu» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    הסוג הבא של התפריט שקיים לנו נקרא context menu. context זה תלוי הקשר. context menu זה תפריט שמוצג רק כאשר אנחנו לוחצים לחיצה ארוכה, כלומר long click.

  2. 00:18

    לדוגמה אם אנחנו לוחצים long click על האקטיביטי ואנחנו רוצים שיוצג כתוצאה מכך תפריט, אנחנו יכולים להגדיר את זה. והסוג של התפריט הזה זה context menu ולא options menu שדיברנו עליו לפני זה שהוא תפריט שמוצג רק כאן למעלה.

  3. 00:38

    אז בואו נראה איך אנחנו מציגים context menu. הדבר הראשון שאנחנו צריכים לעשות זה לבנות את ה-menu. כאן זה מאוד דומה למה שעשינו מבחינת ה-options menu וזה פשוט מאוד ליצור תיקייה בתוך res שקשורה ל-menus בואו נצרף

  4. 00:55

    android resource directory נבחר menu אוקיי ובתוך התיקייה הזאת אנחנו מצרפים קובץ בואו נקרא לו מניו ובואו ניקח לדוגמה send בכדי לשלוח כל מיני פריטים שונים כתלות בלחיצה על התפריט אז בואו נצרף את זה ניגש לתפריט ונגדיר את הפריטים השונים דומה למה שהיה לנו לפני זה בואו ניקח אייטם נגדיר לאייטם ID מניו אייטם אימייל בואו ניתן לו טייטל אימייל בואו נשכפל את זה ניקח עוד

  5. 01:44

    אחד של send sms והאחרון וואטסאפ והנה הגדרנו תפריט שמאפשר לבצע שליחה של אימייל של sms או של וואטסאפ בדומה למה שעשינו באופשונס מניו אוקיי אבל אנחנו לא רוצים להציג את התפריט הזה באופשונס מניו אנחנו רוצים להציג אותו כאשר לוחצים לחיצה ארוכה לדוגמה על האקטיביטי.

  6. 02:15

    אז איפה עושים את זה? כאן אנחנו צריכים לגשת למיין אקטיביטי ולבצע את הדברים הבאים. דבר ראשון אנחנו רוצים להירשם לקונטקסט מניו.

  7. 02:29

    יש לנו כאן את האובייקט של המיין אקטיביטי. אם נסתכל על המיין אקטיביטי שלנו אז אנחנו יכולים לראות שזה רלטיב לאאוט הפעם ויש לה איידי שנקרא רלטיב לאאוט מיין ומה שעשינו במיין אקטיביטי זה יצרנו פה את האובייקט ומצאנו אותו ועכשיו בתוך הרלטיב לאאוט מיין יש לנו את האובייקט של הלאאוט עצמו

  8. 02:57

    אז מה שאנחנו רוצים לעשות זה לקרוא לפונקציה שנקראת רג'יסטר פור קונטקסט מניו רג'יסטר פור קונטקסט מניו זה פונקציה שאומרת לנו טוב לאיזה view אתם רוצים שאני ארשם בואו ניתן את ה-view relative layout main וזה בעצם גורם לקונטקסט מניו בעצם להיפתח ברגע שלוחצים long click על האקטיביטי.

  9. 03:26

    הדבר הבא שאנחנו צריכים לעשות זה לדרוס פונקציה שנקראת on create context menu ומה שאנחנו רוצים פה זה לעשות משהו דומה למה שעשינו בעבר וזה לנפח את התפריט.

  10. 03:38

    בואו ניקח מניו inflater, get מניו inflater, מניו inflater נקודה inflate, ואנחנו רוצים לתת לו r, בתוך r יש לנו מניו, ובתוך המניו יש לנו את המניו send שאנחנו רוצים.

  11. 04:02

    הדבר הבא שאנחנו רוצים לתת זה את אובייקט ה-context מניו שקיבלנו לכאן לפונקציה, מניו בכדי שהיא תנפח את ה-XML בתוכו. כעת בביצוע לונג קליק על ה-Activity המניו אמור להיות מוצג.

  12. 04:21

    בואו נריץ ונבדוק את זה. נלחץ לונג קליק על ה-Activity והנה אנחנו רואים את התפריט שביצענו, מוצג בדיוק באמצע, לא כאן למעלה כמו ה-Options מניו.

  13. 04:34

    אנחנו יכולים לבחור פריט והוא סוגר אותו. בואו נלחץ עוד פעם לונג קליק. בחירה מחוץ לפריט גם סוגרת אותו ואנחנו עכשיו ורוצים לטפל במצב שהמשתמש בוחר באופציה מסוימת.

  14. 04:47

    אז כאן אנחנו צריכים לחזור ולדרוס פונקציה נוספת, והפונקציה הנוספת שאנחנו צריכים לדרוס נקראת onContextItemSelected. כאשר היוזר בוחר איזשהו פריט ברשימה, מה אנחנו רוצים לבצע?

  15. 05:06

    אז אנחנו צריכים לבצע פה משהו דומה למה שעשינו, עשינו פה בעבר איזשהו סוויץ', אייטם זה הפריט שלחצו עליו, r.get itemid זה ה-id שלו וכעת אנחנו יכולים לבדוק מה ה-id שנשלח אלינו האם זה r.id. והיה לנו פה את האימייל ראשון אם כן בואו נציג איזשהו טוסט שאנחנו שולחים אימייל בואו נעשה פה רק

  16. 05:42

    length long לאחר מכן נשכפל את זה ונטפל בשני המצבים האחרים יש לנו פה sms ויש לנו פה את וואטסאפ בואו נריץ שוב שוב פעם נבצע לחיצה ארוכה וכעת אם אנחנו בוחרים לדוגמה בסמס אנחנו רואים שהוא מבצע את הקוד בהתאם לחיצה ארוכה אימייל מבצע את הקוד בהתאם עכשיו

  17. 06:17

    האם אנחנו חייבים רק את המיין אקטיביטי להירשם או האם אנחנו יכולים לקחת אפילו איזשהו לחצן לא קשור לכלום בואו נבדוק את זה בואו בואו ניגש ונייצר פה איזשהו בטון, נגדיר אותו כ-match parent, wrap-content, נגדיר עליו איזשהו טקסט, send, ניתן לו ID כי אנחנו רוצים לאתר אותו,

  18. 06:49

    בטון send, וכל מה שאנחנו רוצים לעשות זה לאתר את הלחצן הזה דרך ה-ID שלו ולתת אותו כאן במקום ל-relative layout.

  19. 07:01

    אז בואו נקרא פה ל-Find View by ID וניתן את בטון send. בואו נריץ נלחץ על הלחצן שימו לב שאני לוחץ עליו לא long click לא קורה שום דבר זה ממש לחיצות רגילות לגמרי אם אני עכשיו לוחץ ולא עוזב רק אז התפריט מוצג לנו זה context menu הוא מוצג אך ורק ב-long click על פריט ואנחנו רואים שהכל עובד כמו שצריך עכשיו מה קורה אם אנחנו רוצים להציג שני תפריטים שונים כתלות

  20. 07:41

    ב-Long Click על שני רכיבים שונים. הרי מה שאנחנו רואים כאן ושנרשמנו לרכיב זה אחלה אבל בכל מקרה הפונקציה הזאת מתבצעת On Create Context Menu ויוצרת לנו תפריט אחד אז איך אנחנו יכולים בעזרת הפונקציה הזאת ליצור שני תפריטים שונים בואו נראה את זה יש יש לנו כאן את המיין אקטיביטי ומה שנעשה זה

  21. 08:10

    טיפה נשנה את הלחצן הזה בכדי לבצע הפרדה בינו ובין לחצן אחר כך שכל לחצן יפעיל לנו תפריט שונה לגמרי אז לצורך הדוגמה בואו ניגש ונעשה אותו קצת יותר אסתטי בואו נגדיר שהרוחב שלו בעצם ב-80 dp וגם הגובה שלו נוריד ממנו את הטקסט הזה ובמקום הטקסט נשים עליו איזשהו background נלך לדרואובול ובדרובול יש לנו שם איזשהו אייקון של send כזה,

  22. 08:47

    הגדרתי מקודם, ומה שאנחנו רוצים לעשות רק זה לתת לו align parent bottom true, align parent right true, כדי שהוא יהיה ימינה, ובואו ניקח את הלחצן הזה, נשכפל אותו ונגדיר לחצן נוסף עבור צבעים, קולורס לפט טרו ויש לנו שמה קולורס אז הנה אנחנו רואים שיש לנו כאן שני לחצנים ואנחנו רוצים שכל לחצן יפעיל לנו תפריט אחר לגמרי

  23. 09:31

    אז אחרי שיש לנו את הלחצנים בואו ניגש ונייצר עוד קובץ תפריט נקרא לו מניו underline colors הפריטים שאנחנו רוצים לתת כאן זה פריטים עבור צבעים יש לנו אייטם בואו ניתן id מניו אייטם רד דומה למה שעשינו לפני זה ובואו ניקח טייטל רד נשך פרל יש לנו כאן גרין יש לנו כאן

  24. 10:02

    בלו והנה יש לנו שני תפריטים אין ביניהם שום קשר מעולה הדבר הבא שאנחנו רוצים לעשות ולהגדיר איזה תפריט עולה על איזה רכיב או מוצג כשלוחצים long קליק על איזה רכיב אז אנחנו צריכים לחזור ל-Main Activity וכמו שנרשמנו ללחצן הראשון בואו נשכפל

  25. 10:39

    את זה עם Ctrl D נירשם גם ללחצן השני שהיה Button Colors כעת כל אחד מהלחצנים יפעיל לנו את התפריט אבל בהפעלת התפריט הפונקציה הזאת מתבצעת כל פעם מחדש ואנחנו רואים שרק תפריט אחד מתבצע פה r.menu.menu send אז מה אנחנו צריכים לעשות כל מה שאנחנו צריכים לעשות זה בדיקה של if על הפונקציה של הרכיב הזה יש לנו פה רכיב שנקרא view v וזה בעצם מקבל את הלחצן שהפעיל אותו אז מה שאנחנו

  26. 11:00

    צריכים לעשות זה פשוט לקרוא ל-v.getid ולבדוק האם אתה שווה ל-r.id.bd בטון סנד רק אם אתה שווה לבטון סנד זה אומר שכרגע לחצו על בטון סנד במידה ולחצו על בטון סנד זה התפריט שאני רוצה לנפח אם לחצו על תפריט אחר על רכיב אחר ליתר דיוק אז אנחנו רוצים לנפח את התפריט השני בואו ניקח ונשכפל את זה

  27. 11:59

    לפה ונגדיר שאנחנו רוצים את מניו כלורס בואו נבדוק אנחנו כבר יכולים לראות למטה את שני הלחצנים לחיצת long click על הראשון נותנת לנו את התפריט של האימייל sms ווואטסאפ אנחנו יכולים לבחור ולראות שזה עובד לחיצה על הלחצן השני פותחת לנו red green blue ולא עשינו שום דבר עדיין אז בואו ניגש ונשכפל כאן גם את האופציות של רד גרין בלו בואו ניגש ונעשה

  28. 12:42

    אופציה אחת לרד ואנחנו לא רוצים להציג טוסט אנחנו רוצים להציג אנחנו רוצים לגשת ל-relative layout men set background color color.red בואו נשכפל את כל זה עוד פעמיים ניגש לגרין גרין ולבסוף יש לנו בלו ובואו נבדוק נריץ נלחץ על הלחצן של הצבעים לחיצה ארוכה נבחר ברד עובד לחיצה ארוכה גרין לחיצה ארוכה בלו לחיצה ארוכה על הסנד כל עובד כמו שצריך

  29. 13:35

    רק שימו לב שעדיין אין לנו פה את הצ'קבוקס המעניינים האלה שהיו לנו כשעבדנו על האופצ'נז מניו אז בואו בזריזות נוסיף אותם ונזכר איך זה היה הנה יש לנו פה את המניו colors ומה שעשינו זה עטפנו בגרופ את הכל בכדי להגדיר בבת אחת

לקורס המלא: קורס פיתוח אפליקציות לאנדרואיד

ההרצאה הקודמת: Options Menu

ההרצאה הבאה: Popup Menu

הרצאות קשורות מקורסים אחרים

  • קורס ריאקט - Context
  • תפריטים וסרגלים - Menu and Toolbar
  • יצירת מחלקת Context - לתקשורת עם מסד הנתונים
  • יצירת Context Class - לגישה למסד הנתונים

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת JAVA - קורס ג'אווה למתחילים
  • קורס פיתוח אפליקציות - לאייפון iPhone iOS - ב-Swift-Xcode
  • קורס פלאטר - Flutter - שפת DART של גוגל למובייל - פיתוח אפליקציות לאנדרואיד ואייפון
  • קורס PhoneGap - פיתוח אפליקציות לאנדרואיד ואייפון