وقتی یک اپلیکیشن را باز میکنید، معمولا اول دنبال چهچیزی در آن میگردید؟ یا چهچیزی در یک اپلیکیشن است که به کاربر امکان میدهد تا ازبین گزینهها یا کارهایی انتخاب کند؟ پاسخ این دو سوال بسیار واضح است. پاسخ عنصر مهمی در رابط کاربری و تجربه کاربری اپلیکیشنهاست.
منوها کاربردی و ضروری هستند، چه در سایتها چه در اپلیکیشنها. دراینجا بحث اصلی برسر منوها و ساختن آنها در اپلیکیشنهای اندرویدی است و کاری با منوی سایتها نداریم. اپلیکیشنها چه اندرویدی باشند چه نباشند، المانها و خصوصیتهای مشترکی دارند. چیزهایی هستند، مثل منوها، که باید در همهی اپلیکیشنها باشند.
شاید من و شمای کاربر خیلی وقتها اهمیت و نقشی را که منوها در بهبود تعامل با اپلیکیشن دارند نادیده بگیریم. اما توسعهدهنده اپ نمیتواند و نباید ازکنار ساختن منوها بهسادگی بگذرد. منوها انواع مختلفی دارند. هر منو مناسب برای کاری است و گزینههای مختلفی را شامل میشود.
در این مطلب دربارهی منوها در اندروید صحبت میکنم. انواع منوها در اندروید را به شما معرفی میکنم و کمی هم دربارهی آموزش ساخت منوها در اندروید و کدهای لازم برای آن بحث خواهم کرد. درآخر، منابع و سایتهایی که توسعهدهنده اپهای اندرویدی میتواند دربارهی منوها در اندروید بیشتر بخواند معرفی شده است.
اگر میخواهید بیشتر دربارهی توسعه اپلیکیشن و مراحل مهم آن بدانید، «۷ مرحله مهم در توسعه اپلیکیشن و مارکت آن» را بخوانید.
آنچه در این نوشته خواهیم داشت
منوها در اندروید
چرا منوها و طراحی آنها مهم است؟ چند نوع منو میشود با اندروید ساخت؟ هرکدام برای چه هدفی مناسبتر است؟ و چطور میشود آنها را ساخت؟
اول باید از اهمیت منوها گفت. منوها مهم هستند چون درواقع مجموعهای از کارها (actions) را که کاربر برای تعامل با اپلیکیشن به آنها نیاز دارد دراختیار او میگذارد. نحوهی دستهبندی این کارها و چینش آنها کنار یکدیگر و درکنار سایر المانهای صفحه موضوع بسیار مهم و حساسی است. چون مستقیما بر تجربه کاربری و تعامل کاربر با اپ تاثیر میگذارند.
توسعهدهنده اپهای اندرویدی ۳ انتخاب دارد. یعنی در اندروید میتوان ۳ نوع منو ساخت (این ۳ نوع منو را درادامه توضیح خواهم داد). نکتهی مهمی دربارهی ساخت منوها در اندروید وجود دارد: توسعهدهنده نیاز نیست که منو و تکتک موارد (گزینهها یا Items) آن را کدنویسی کند. بهجای آن در اندروید، Menu Resource (یا منبع منو) وجود دارد که محل تعریفکردن منوهای اپلیکیشن است. توسعهدهنده میتواند این منبع را گسترش دهد و جزئیات را به آن اضافه کند. داخل در این منبع، فرمت XML استانداردی برای ساخت منو تعریف شده است که باید منو و جزئیات آن در درون آن فرمت تعریف شود.
ساختار کدهای (سینتکس) منبع منو و فرمت XML در اندروید به شکل زیر است:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@[+][package:]id/resource_name" android:title="string" android:titleCondensed="string" android:icon="@[package:]drawable/drawable_resource_name" android:onClick="method name" android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"] android:actionLayout="@[package:]layout/layout_resource_name" android:actionViewClass="class name" android:actionProviderClass="class name" android:alphabeticShortcut="string" android:alphabeticModifiers=["META" | "CTRL" | "ALT" | "SHIFT" | "SYM" | "FUNCTION"] android:numericShortcut="string" android:numericModifiers=["META" | "CTRL" | "ALT" | "SHIFT" | "SYM" | "FUNCTION"] android:checkable=["true" | "false"] android:visible=["true" | "false"] android:enabled=["true" | "false"] android:menuCategory=["container" | "system" | "secondary" | "alternative"] android:orderInCategory="integer" /> <group android:id="@[+][package:]id/resource name" android:checkableBehavior=["none" | "all" | "single"] android:visible=["true" | "false"] android:enabled=["true" | "false"] android:menuCategory=["container" | "system" | "secondary" | "alternative"] android:orderInCategory="integer" > <item /> </group> <item > <menu> <item /> </menu> </item> </menu>
عناصر (تگهای) اصلی آن ساختار و منبع منو عبارتانداز:
- <menu>: تگ منو که Container است برای تمامی آیتمها و گروهها و منو را تعریف میکند.
- <item>: هریک از آیتمها (موارد یا گزینههای منو) در این تگ تعریف میشود. با این تگ میشود submenu هم تعریف کرد. به هریک از آیتمها ممکن است خاصیتهای مختلفی اضافه شود که مهمترین آنها id , icon or title هستند.
- <group>: این تگ اختیاری است و اگر توسعهدهنده بخواهد آیتمهای منو را گروهبندی کند، میتواند از این تگ استفاده کند.
مزایای استفاده از فرمت XML برای منوها در اندروید
این امکان در اندروید، یعنی منبع منو و فرمت استاندارد XML برای تعریفکردن و گسترشدادن منو، چه مزیتهایی دارد و چرا کار را برای توسعهدهنده اپهای اندرویدی راحتتر میکند؟
- در این فرمت، ساختار منو ازاول مشخص است. توسعهدهنده راحتتر میتواند این ساختار را مجسم کند.
- بااستفاده از منبع منو، بخش منو و کدها و جزئیات مربوط به آن از سایر بخشها و کدها جدا شده است.
- این امکان به توسعهدهنده اجازه میدهد تا منوهای واکنشگرا برای دستگاههای مختلف تعریف کند.
انواع منوها در اندروید (+ نمونه)
توسعهدهنده اپ های اندرویدی برای ساختن منو ۳ انتخاب دارد: Options Menu, Contextual Menu & Popup Menu. ساختن هرکدام از این منوها درقالب همان ساختار اصلی (منبع منو) در اندروید انجام میشود. توسعهدهنده امکانات زیادی برای تغییردادن در ظاهر این منوها ندارد. درادامه با کاربرد و نمونههای این ۳ نوع منو آشنا میشوید.
۱. Options Menu
با منو Options یا منو گزینهها شروع میکنیم. در این نوع از منو گزینههایی که دراختیار کاربر قرار میگیرند مربوط میشوند به کارهای اصلی که او میتواند در محیط اپ انجام دهد مانند جستجو کردن، بازکردن صفحهی جدید، نوشتن ایمیل جدید و … . جایی که این منو نمایش داده میشود براساس اینکه توسعهدهنده از کدام نسخهی اندروید استفاده میکند متفاوت است. اگر اپلیکیشن با اندروید 2.0 و پایینتر ساخته شده باشد، حاصل میشود منویی که در قسمت بالایی تصویر زیر میبینید. اما اگر اپ با اندروید 3.0 و بالاتر ساخته شده باشد، منو Options در اپلیکیشن بار (app bar) نمایش داده میشود (قسمت پایینی تصویر زیر). در تصویر زیر بهخوبی نمونهای از کاربرد منو Options، محل قرارگرفتن آن و آیتمهایی که در درون آن قرار میگیرد نشان داده شده است.
با اضافهکردن کدهای کاتلین به فرمت XML این منو میشود، منو Options را به یک activity اختصاص داد. این کار را میشود برای همهی منوها در اندروید انجام داد:
override fun onCreateOptionsMenu(menu: Menu): Boolean { val inflater: MenuInflater = menuInflater inflater.inflate(R.menu.game_menu, menu) return true }
۲. Contextual Menu
دومین نوع از منو یا Contextual Menu (منوی متنی) کارهایی را دربرمیگیرد که کاربر میتواند بر روی یک المان خاص یا تصویر یا متن یا هرچیزی که انتخاب میکند انجام دهد. مثلا وقتی شما یک عکس را انتخاب میکنید و روی آن کلیک میکنید و نگه میدارید، یک منوی متنی برای شما باز میشود که گزینههای دانلودکردن، حذفکردن یا ویرایشکردن را دارد. منوی متنی منویی شناور (Floating Menu) است که توسعهدهنده برای اینکه این منو کجا نمایش داده شود دو انتخاب دارد. انتخاب اول همان چیزی است که در مثال آورده شده است. انتخاب دوم، Contextual action bar در بالای صفحه است.
۳. Popup Menu
آخرین منو در اندروید پاپآپ منوها هستند. توضیحدادن کاربرد این منو در اندروید کمی کار سختی است. بهتر است اول مثال بزنم. وقتی کاربر در محیط اپلیکیشن است و موس را میبرد روی المانی یا المانی را میبیند و منویی عمودی باز میشود که به او امکان میدهد تا آن المان را بهاشتراک بگذارد یا ایمیل کند یا اطلاعات بیشتری دربارهی آن بگیرد، یک منوی پاپآپ برای او باز می شود. درنتیجه منوی پاپآپ مختص است به المانی که کاربر میبیند. فرق منو پاپآپ با منوی متنی در این است که پاپآپ منو ممکن است با یکی از دو هدف زیر در اپ قرار داده شده باشد: کار خاصی را که مرتبط با آن المان است معرفی کند یا ممکن است توسعهدهنده اپلیکیشن میخواسته تا انتخابی متفاوت یا اضافهتر از آنهایی که در منوی متنی وجود دارد به کاربر بدهد.
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/share" android:title="Share"/> <item android:id="@+id/Mail" android:title="Mail"/> <item android:id="@+id/MoreInfo" android:title="More Information"/> </menu>
اندروید استودیو اولین انتخاب برای توسعه اپهای اندرویدی است. اگر میخواهید بیشتر با امکانات اندروید استودیو آشنا شوید، «پلاگینهای ضروری اندروید استودیو» را بخوانید.
دستهبندیکردن آیتم منوها یا Menu Groups در اندروید
امکان بسیار کاربردی دیگری که توسعهدهنده اپلیکیشنهای اندرویدی دراختیار دارد، این است که میتواند آیتمهای منوهای مختلف در اپ را که ویژگیهای خاص و مشترکی دارند در یک گروه بانام menu group جمع کند. بعد بهراحتی میتواند برای این گروه مثلا معین کند که تمام آیتمهای داخل در آن hide یا disable شوند.
قطعه کد زیر منبع منویی را نشان میدهد که گروهی در آن تعریف شده است:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_save" android:icon="@drawable/menu_save" android:title="@string/menu_save" /> <!-- menu group --> <group android:id="@+id/group_delete"> <item android:id="@+id/menu_archive" android:title="@string/menu_archive" /> <item android:id="@+id/menu_delete" android:title="@string/menu_delete" /> </group> </menu>
جمعبندی و نتیجهگیری
۱. اپلیکیشن ساختن کار چندان سختی نیست. برای ساختن اپلیکیشنهای اندرویدی راههای مختلفی وجود دارد. علاوهبر اندروید استودیو، فریمورکهای توسعهی اپلیکیشن هم گزینهی مناسبی هستند و کارها را، ازجمله طراحی و ساخت منوها، راحتتر کردند.
۲. منوها در اندروید ۳ نوع هستند که هرکدام ویژگیها و کاربردهای خاص خودشان را دارند. نکته اینجاست که برای ساختن همهی آنها باید به فرمت XML رجوع کرد.
۳. برای اینکه بیشتر دربارهی منوها در اندروید بخوانید و یاد بگیرید، سری به این دو سایت بزنید: developer.android.com و tutlane.com. (برای نوشتن این محتوا نیز از مطالب این دو سایت و همچنین geeksforgeeks.org کمک گرفته شده است.)
۴. آنچه در این مطلب گفته شد، مهمترین نکاتی بود که هر علاقهمندی به ساختن اپلیکیشنهای اندرویدی دربارهی منوها در اندروید باید بداند. اما ریزهکاریها و نکات بیشتری وجود دارد که جای آنها در دوره آموزش برنامهنویسی اندروید است و حتی با خواندن منابع بیشتر هم شاید بهدرستی فهمیده نشود.