שימוש בתצוגות של פעולות ובספקי פעולות

כדאי לנסות את התכונה 'כתיבה מהירה'
Jetpack Compose היא ערכת הכלים המומלצת לבניית ממשק משתמש ב-Android. איך מוסיפים רכיבים ב-Compose

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

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

ב-AndroidX יש כמה ווידג'טים מיוחדים של תצוגת פעולות ושל ספקי פעולות. לדוגמה, הווידג'ט SearchView מטמיע תצוגת פעולה להזנת שאילתות חיפוש. הווידג'ט ShareActionProvider מטמיע ספק פעולות לשיתוף מידע עם אפליקציות אחרות. אפשר גם להגדיר תצוגות פעולה וספקי פעולה משלכם.

הוספת תצוגת פעולה

כדי להוסיף תצוגת פעולות, יוצרים רכיב <item> במשאב התפריט של סרגל הכלים, כפי שמתואר בקטע הוספה וטיפול בפעולות. מוסיפים לאלמנט <item> אחד מהמאפיינים הבאים:

  • actionViewClass: המחלקה של הווידג'ט שמטמיע את הפעולה
  • actionLayout: משאב פריסה שמתאר את הרכיבים של הפעולה

מגדירים את המאפיין showAsAction לערך "ifRoom|collapseActionView" או "never|collapseActionView". הדגל collapseActionView מציין איך להציג את הווידג'ט כשהמשתמש לא מבצע איתו אינטראקציה. אם הווידג'ט נמצא בסרגל האפליקציות, הוא יוצג כסמל באפליקציה. אם הווידג'ט נמצא בתפריט האפשרויות הנוספות, הוא יוצג באפליקציה כפריט תפריט. כשהמשתמש יוצר אינטראקציה עם תצוגת הפעולות, היא מתרחבת וממלאת את סרגל האפליקציות.

לדוגמה, הקוד הבא מוסיף ווידג'ט SearchView לסרגל האפליקציות:

<item android:id="@+id/action_search"
     android:title="@string/action_search"
     android:icon="@drawable/ic_search"
     app:showAsAction="ifRoom|collapseActionView"
     app:actionViewClass="androidx.appcompat.widget.SearchView" />

אם המשתמש לא מקיים אינטראקציה עם הווידג'ט, האפליקציה מציגה את הווידג'ט בתור הסמל שצוין ב-android:icon. אם אין מקום בסרגל האפליקציות, הפעולה תתווסף לתפריט האפשרויות הנוספות.

תמונה שבה מוצגת סרגל חיפוש עם סמלים בתחילתו ובסופו.
איור 1. סרגל חיפוש עם סמלים בתחילתו ובסופו.

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

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

אם צריך להגדיר את הפעולה, עושים זאת ב-callback‏ onCreateOptionsMenu() של הפעילות. אפשר לקבל את הפניה לאובייקט של תצוגת הפעולה על ידי קריאה לשיטה getActionView(). לדוגמה, הקוד הבא מקבל את הפניה לאובייקט של הווידג'ט SearchView שהוגדר בדוגמת הקוד הקודמת:

Kotlin

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.main_activity_actions, menu)

    val searchItem = menu?.findItem(R.id.action_search)
    val searchView = searchItem?.actionView as SearchView

    // Configure the search info and add any event listeners.

    return super.onCreateOptionsMenu(menu)
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_activity_actions, menu);

    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchView =
            (SearchView) searchItem.getActionView();

    // Configure the search info and add any event listeners.

    return super.onCreateOptionsMenu(menu);
}

תגובה להרחבת תצוגת הפעולה

אם לרכיב <item> של הפעולה יש דגל collapseActionView, תצוגת הפעולה תוצג באפליקציה כסמל עד שהמשתמש יבצע אינטראקציה עם תצוגת הפעולה. כשהמשתמש מקייש על הסמל, ה-handler המובנה של onOptionsItemSelected() מרחב את תצוגת הפעולות. אם המשנה של הסוג Activity מבטל את הגדרת ברירת המחדל של השיטה onOptionsItemSelected(), שיטת ההחרגה חייבת לקרוא ל-super.onOptionsItemSelected() כדי שהסוג האב יוכל להרחיב את תצוגת הפעולה.

אם רוצים לבצע פעולה כלשהי כשהפעולה מורחבת או מכוונת, אפשר להגדיר כיתה שמטמיעה את MenuItem.OnActionExpandListener ולהעביר חבר של הכיתה הזו אל setOnActionExpandListener(). לדוגמה, יכול להיות שתרצו לעדכן את הפעילות בהתאם לכך שחלון הפעולות מורחב או מקופל. קטע הקוד הבא מראה איך מגדירים מאזין ומעבירים אותו:

Kotlin

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.options, menu)

    // Define the listener.
    val expandListener = object : MenuItem.OnActionExpandListener {
        override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
            // Do something when the action item collapses.
            return true // Return true to collapse the action view.
        }

        override fun onMenuItemActionExpand(item: MenuItem): Boolean {
            // Do something when it expands.
            return true // Return true to expand the action view.
        }
    }

    // Get the MenuItem for the action item.
    val actionMenuItem = menu?.findItem(R.id.myActionItem)

    // Assign the listener to that action item.
    actionMenuItem?.setOnActionExpandListener(expandListener)

    // For anything else you have to do when creating the options menu,
    // do the following:

    return true
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.options, menu);

    // Define the listener.
    OnActionExpandListener expandListener = new OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            // Do something when the action item collapses.
            return true;  // Return true to collapse action view.
        }

        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            // Do something when it expands.
            return true;  // Return true to expand the action view.
        }
    };

    // Get the MenuItem for the action item.
    MenuItem actionMenuItem = menu.findItem(R.id.myActionItem);

    // Assign the listener to that action item.
    MenuItemCompat.setOnActionExpandListener(actionMenuItem, expandListener);

    // For anything else you have to do when creating the options menu,
    // do the following:

    return true;
}

הוספת ספק פעולות

כדי להצהיר על ספק פעולות, יוצרים אלמנט <item> במשאב התפריט של סרגל הכלים, כפי שמתואר בקטע הוספה וטיפול בפעולות. מוסיפים את המאפיין actionProviderClass ומגדירים אותו בתור שם המחלקה המלא של ספק הפעולה.

לדוגמה, הקוד הבא מכריז על ShareActionProvider, שהוא ווידג'ט שמוגדר בספריית AndroidX ומאפשר לאפליקציה לשתף נתונים עם אפליקציות אחרות:

<item android:id="@+id/action_share"
    android:title="@string/share"
    app:showAsAction="ifRoom"
    app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider"/>

במקרה כזה, אין צורך להצהיר על סמל לווידג'ט, כי ShareActionProvider מספק גרפיקה משלו. אם משתמשים בפעולה מותאמת אישית, צריך להצהיר על סמל.

מקורות מידע נוספים

  • בדף ShareActionProvider תוכלו לראות דוגמה להוספת פעולת שיתוף לסרגל האפליקציות העליון.
  • מידע נוסף על יצירת ספק פעולות בהתאמה אישית זמין במאמר ActionProvider.