افزودن و مدیریت کنش‌ها

امتحان کردن روش Compose
Jetpack Compose جعبه‌ابزار واسط کاربر توصیه‌شده برای Android است. با نحوه افزودن مؤلفه‌ها در Compose آشنا شوید.

نوار برنامه به شما امکان می‌دهد دکمه‌هایی برای کنش‌های کاربر اضافه کنید. این ویژگی به شما امکان می‌دهد مهم‌ترین کنش‌ها را برای بافت فعلی در بالای برنامه قرار دهید. برای مثال، برنامه مرور عکس ممکن است دکمه‌های هم‌رسانی و ایجاد آلبوم را در بالا نشان دهد وقتی کاربر درحال نگاه کردن به حلقه عکس خود است. وقتی کاربر به عکس تکی نگاه می‌کند، برنامه ممکن است دکمه‌های برش و فیلتر را نشان دهد.

فضای نوار برنامه محدود است. اگر برنامه‌ای کنش‌های بیشتری نسبت به آنچه در نوار برنامه جا می‌شود اعلام کند، نوار برنامه کنش‌های اضافی را به منو سرریز ارسال می‌کند. برنامه همچنین می‌تواند مشخص کند که کنش همیشه در منو سرریز نشان داده شود، به‌جای اینکه در نوار برنامه نمایش داده شود.

تصویری که برنامه «اکنون در Android» را با نماد نوار اقدام نشان می‌دهد
شکل ۱. نماد کنش در برنامه «اکنون در Android».

افزودن دکمه‌های کنش

همه دکمه‌های کنش و موارد دیگری که در سرریز کنش دردسترس هستند در منبع منو XML تعریف شده‌اند. برای افزودن کنش‌ها به نوار کنش، فایل XML جدیدی در دایرکتوری res/menu/ پروژه‌تان ایجاد کنید.

برای هر موردی که می‌خواهید در نوار اقدام گنجانده شود، یک عنصر <item> اضافه کنید، همان‌طور که در نمونه فایل XML منو زیر نشان داده شده است:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto">

    <!-- "Mark Favorite", must appear as action button if possible. -->
    <item
        android:id="@+id/action_favorite"
        android:icon="@drawable/ic_favorite_black_48dp"
        android:title="@string/action_favorite"
        app:showAsAction="ifRoom"/>

    <!-- Settings, must always be in the overflow. -->
    <item android:id="@+id/action_settings"
          android:title="@string/action_settings"
          app:showAsAction="never"/>

</menu>

مشخصه app:showAsAction تعیین می‌کند که آیا کنش به‌عنوان دکمه‌ای در نوار برنامه نشان داده شود یا نه. اگر app:showAsAction="ifRoom" را تنظیم کنید (مانند کنش موردعلاقه در کد نمونه)، اگر در نوار برنامه فضا وجود داشته باشد، کنش به‌صورت دکمه نمایش داده می‌شود. اگر فضای کافی وجود نداشته باشد، کنش‌های اضافی به منوِ سرریز ارسال می‌شود. اگر app:showAsAction="never" را تنظیم کنید—همان‌طور که در کنش تنظیمات کد نمونه نشان داده شده است—کنش همیشه در منو سرریز فهرست می‌شود و در نوار برنامه نمایش داده نمی‌شود.

اگر کنش در نوار برنامه نمایش داده شود، سیستم از نماد کنش به‌عنوان دکمه کنش استفاده می‌کند. می‌توانید نمادهای مفید زیادی را در نمادهای Material پیدا کنید.

پاسخ دادن به کنش‌ها

وقتی کاربر یکی از موارد نوار برنامه را انتخاب می‌کند، سیستم روش فراخوانی برگشتی onOptionsItemSelected() فعالیت شما را فراخوانی می‌کند و MenuItem شیء را ارسال می‌کند تا نشان دهد روی کدام مورد تک‌ضرب زده شده است. در پیاده‌سازی onOptionsItemSelected()، روش MenuItem.getItemId() را فراخوانی کنید تا مشخص شود روی کدام مورد تک‌ضرب زده شده است. شناسه برگردانده‌شده با مقداری که در مشخصه android:id عنصر <item> مربوطه اعلام می‌کنید مطابقت دارد.

برای مثال، تکه‌کد زیر بررسی می‌کند که کاربر کدام کنش را انتخاب می‌کند. اگر روش کنش کاربر را تشخیص ندهد، روش اَبَرکلاس را فراخوانی می‌کند:

کاتلین

override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
    R.id.action_settings -> {
        // User chooses the "Settings" item. Show the app settings UI.
        true
    }

    R.id.action_favorite -> {
        // User chooses the "Favorite" action. Mark the current item as a
        // favorite.
        true
    }

    else -> {
        // The user's action isn't recognized.
        // Invoke the superclass to handle it.
        super.onOptionsItemSelected(item)
    }
}

جاوا

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_settings:
            // User chooses the "Settings" item. Show the app settings UI.
            return true;

        case R.id.action_favorite:
            // User chooses the "Favorite" action. Mark the current item as a
            // favorite.
            return true;

        default:
            // The user's action isn't recognized.
            // Invoke the superclass to handle it.
            return super.onOptionsItemSelected(item);

    }
}