نمایش تصویر موجود در منابع بوسیله ImageView

در این درس، به بررسی نحوه اضافه کردن آیتمها به منو (Menu) در زمان اجرا (Runtime) در اندروید استودیو میپردازیم. شما خواهید آموخت چگونه با استفاده از متد add() در کلاس Menu، آیتمهای پویا را به منو اضافه کنید و چطور به رویدادهای انتخاب آیتمها با onOptionsItemSelected پاسخ دهید. این مهارت برای ایجاد رابط کاربری منعطف و تعاملی بسیار حیاتی است، به ویژه وقتی نیاز داریم منو بر اساس دادههای دینامیک یا وضعیت برنامه تغییر کند. در ویدیوی 60 دقیقهای مربوطه که در یوتیوب منتشر شده، همه این مفاهیم به صورت عملی نشان داده شده و شما میتوانید فرآیند کامل از ایجاد منوهای XML تا مدیریت آنها در کد جاوا یا کاتلین را ببینید و یاد بگیرید.
شما میتونید به صورت پویا و دینامیک هم با استفاده از کدهای جاوا آیتم هایی به منو اضافه کنید. اول از همه به یک آیدی منو نیاز دارید. وقتی یک منو در XML تعریف میکنید، آیدی هر آیتم منو در قسمت مربوط به همون آیتم تعریف میشه. مثلا اولین آیتم منوی من آیدیش action _settings هست، و دومیش action _about. مقدار integer مربوط به هرکدوم از این آیدی ها به صورت پویا در زمان تولید کد محاسبه و تولید میشه. وقتی شما آیتم های منوی خودتونو ایجاد میکنید، باید برای هر آیتم ، آیدی منحصربفردی تعیین کنید، ولی بازم میگم آیدی که شما میدید نباید integer باشه.
من از اینجا در متد on CreateOptionsMenu شروع میکنم، و یک متد از شی منو رو فراخونی میکنم که این متد با پارامتری با نام add فراخونی میشه. نسخه های مختلفی از این متد وجود داره. من میخوام از سومی یا چهارمی استفاده کنم، که به یک group آیدی، یک item ID، بعد یک عدد که نشون دهنده موقعیت آیتم منو هستش، و یک string یا string resource نیاز داره. string resource در واقع همون منبع استرینگی هستش یعنی رشته ای که در فایل strings منابع وجود داره و ما ازش استفاده میکنیم. برای آرگومان group ID من فقط صفرو وارد میکنم. چون همه آیتم های منو من توی یک گروه هستن. اگه بخام group ID رو تعریف کنم میتونم بگم که در تعریف منوها میتونیم از تگ group هم استفاده کنیم و این زمانی هست که مثلا بخواییم یک آیتمی رو در منو انتخاب کنیم و اون آیتم خودش شامل یک گروه از آیتم ها باشه در واقع یه روش تعریف منوی چند آیتمی هست. مثلا آیتم ستینگ رو از منو که زدیم یک لیست از آیتم های قابل انتخاب باز بشه و بصورت آبشاری عمل کنه.
برای item ID ام، به یک مقدار ثابت نیاز دارم. ولی در حال حاضر مقدار ثابتی ندارم، ولی ادامه میدم و یک مقدار MENU_ITEM_LOGOUT بهش میدم، بعد با توجه به لیست پیشنهادات برای این ارر میخوام که اندروید استودیو اون مقدار ثابت رو ایجاد کنه، یعنی گزینه ای که با کلمه constant همراه هستش، پس این گزینه رو انتخاب میکنم و اینتر یا return رو به ترتیب در محیط های ویندوز یا مک میزنم تا بپره سر محل تعریفه اون مقدار، و با تایپ کردن بهش یک مقدار میدم. میتونیم هر مقداری رو که دوست داشتیم بهش بدیم. من تایپ میکنم 1001. حالا برای برگشتن به محل بکار رفتن این مقدار ثابت،کرسر رو میذارم روی قسمت نام متغیر یعنی همین قسمت MENU_ITEM_LOGOUT و بعد alt F7 یا آپشن F7رو به ترتیب برای ویندوز و مک فشار میدم و بعد enter یا return، و برمیگردم به جایی که متد add رو ساخته بودم. حالا به یک order value که در واقع نشون دهنده موقعیت آیتم در منو هستش نیاز دارم. در تعریف منوی اصلیم، تنظیمات category orderin رو روی 100 و 101 قرار دادم، پس این یکی آیتم رو بعنوانِ آیتم سوم روی 102 تنظیم میکنم، و این آیتم رو به عنوان آخرین آیتم منو قرار میدم و در آخر به یک برچسب نیاز دارم. که میتونه یا یک literal string یا یک string resource باشه.
با یک literal string شروع میکنم، پس تایپ میکنم Logout و بعدش هم با فشار دادن آلت یا آپشن و اینتر یا return بترتیب در محیطهای ویندوز و مک منوی پیشنهادیم رو باز میکنم و بعد با استفاده از منو پیشنهاد ازش یک string resource استخراج میکنم. پس گزینه اول رو انتخاب میکنم و در قسمتِ resource name، از پنجره Extract Resource کلمه logout رو با حروف کوچک میذارم، و از این به بعد این رشته با این آیدی فراخونی میشه. حالا منوی من باید سه تا آیتم داشته باشه. تستش میکنم. آیکن آپشن منو یا منوی اصلیم رو لمس میکنم و میبینم که آیتم های منوی جدید بالا میان. وقتی منوی جدید رو انتخابش میکنم هیچ اتفاقی نمیفته پس باید برگردم به کلاس Main Activity ام و کد تنظیم کننده این آیتم از منو رو اضافه کنم.
پس در Main Activity م میام پایین اینجا در متد on OptionsItemSelected و این خط هایِ کدم رو انتخاب میکنم، و با فشار دادن control d یا command d به ترتیب در ویندوز و مک دوبرابرش میکنم. آیدی مربوط به آیتم منو رو عوض میکنم، و از لیست پیشنهادی میگردم و اون مقدار ثابت که قبلا ساختم رو استفاده میکنم یعنی MENU_ITEM_LOGOUT، و بعد در پیام Snack bar ام خروجی رو you selected logout تنظیم میکنم و کدم رو مجدد اجرا میکنم.
و اینباروقتی یک آیتم رو انتخاب میکنم پیام اسنکبار مربوط بهش رو که همین الان با عبارت you selected logout تنظیم کردم رو میبینم. بنابراین میتونید منوهاتون رو به صورت ترکیبی از XML استاتیک یا ایستا و کد جاوا پویا ایجاد کنید، اگه بخام واضح تر بگم شما بصورت استاتیک برای تعریف یک منو می تونید بصورت کامل بیاید و کدهاش رو از طریق XML سفارشی کنید؛ یا اینکه نه، بصورت دینامیک بیاید و شبیه کاری که من اینجا انجام دادم با استفاده از جاوا منویی رو تعریف کنید که بعد از اون هر بار برای اضافه کردن یک منوی دیگه نخواهید روال کدنویسی متداول رو ادامه بدید و خیلی راحت تر در کارتون پیش برید؛ ولی برای تنظیم انتخاب منو، یعنی برای تنظیم اتفاقاتی که بعد از انتخاب هر آیتم منو قراره بیفته، معمولا همه کدها در متد on OptionsItemSelected به این صورت که می بینید، نوشته میشن، بنابراین با این تفاسیر حالا دیگه دقیقا میدونید کدهای مربوط به تنظیم انتخاب منو کجا قرار دارن.