تعریف یک گزینه ی جدید به منوی تنظیمات با استفاده از XML

در این درس از دوره جامع توسعه اپلیکیشنهای اندروید، نحوه تعریف و مدیریت Options Menu با استفاده از فایلهای XML آموزش داده میشود. ابتدا ساختار فایلهای منو در دایرکتوری res/menu بررسی شده و اصول ایجاد آیتمهای منو با استفاده از تگهای <menu>
و <item>
توضیح داده میشود. سپس نحوه اتصال این منوها به اکتیویتیها از طریق متد onCreateOptionsMenu و ابزار MenuInflater شرح داده میشود. این روش به توسعهدهندگان کمک میکند تا منوهایی ساختاریافته، قابل نگهداری و سازگار با دستگاههای مختلف ایجاد کنند. آموزش حاضر بر اهمیت تفکیک منطق برنامه از رابط کاربری و مزایای استفاده مجدد از منوها در اکتیویتیها و فرگمنتهای مختلف تأکید دارد و بهطور تخصصی روشهای بهینهسازی تجربه کاربری و مدیریت منابع در اپلیکیشنهای اندرویدی را بررسی میکند.
وقتی برای بار اول یک برنامه اندروید ایجاد میکنید، از قالبهای موجود در اندروید استودیو استفاده میکنید و برنامه یک options menu یا همان منوی اصلی خواهد داشت که وقتی آیکن روی آنرا در گوشه بالا سمت راست کلیک کنید، یک منو pop up باز میشود و اگر آیتم های دیگر هم به آن اضافه کنید، منو از اون گوشه باز میشود و پایین میآید.
وقتی روی هر آیتم کلیک کنید، کدهای جاوایی که برای آن نوشته شده فراخوانی میشود.
میتوانید با نوشتن چند خط کد جاوا کاری کنید تا با انتخاب هر آیتم عملیات خاصی اتفاق بیافتد.
خب؛ بیایید تا به شما نشان بدهم چطوری آیتم های بیشتری برای منو تعریف کنید و یا اینکه چطوری برای آنها کد بنویسیم تا وقتی کاربر هر آیتم رو کلیک کرد رویداد و اتفاقی که میخواهیم رخ بدهد.
در این پروژه با نام Options Menu، به فولدر resource ام یا همین فولدر res، میروم و زیر فولدر menu رو باز میکنم و یک فایل با نام menu_main.xml پیدا میکنم.
این فایل رو ریفرمت میکنم تا خواندن آن آسانتر بشود.
میبینیم که یک عنصر ریشه ای با نام menu دارد و بعد یک آیتم تکی که آیدی آن action _settings هست. در واقع از این آیدی در کلاس Main Activity استفاده میشود. خب؛ اینجا در اندروید استودیو یک ترفندی هست که میتوانید با اون از یک فایل به فایل دیگر پرش کنید.
من alt + F7 رو در ویندوز و opt + F7 رو در مک فشار میدهم که درواقع این میانبر مکان هایی از پروژه که یک نوع بازگشت به id این عبارت اونجا وجود دارد رو با تیتر find usages برای ما میآورد و این پایین برخی از کدها رو می بینیم که در کلاس Main Activity هم هستند.
روی آن دابل کلیک میکنم و کلاس Main Activity رو باز میکنه و میرود سراغ همان خط کدی از جاوا که اون عبارت توش هست.
وقتی کاربر یک آیتمی رو از آپشن منو انتخاب میکند، متد on OptionsItemSelected فراخوانی میشود.
این متد یک تک آرگومان با نام آیتم که نمونه ای از کلاس Menu Item هست رو دریافت میکند.
اگر به documentation مربوط به این کلاس یک نگاهی بیندازیم، میبینیم که یک توضیحاتی ساده در مورد نحوه عملکرد این کلاس رو به ما داده است.
و همانطور که می بینید اینجا هم در قسمت developer guide یک لینک برای راهنمای توسعه منوها دارد که میتوانید از اونجا همه چیز درباره منوها در اندروید رو بخوانید و یاد بگیرید.
کلاس Menu Item یک متد با نام get ItemId دارد که یک مقدار integer برمیگرداند و اون مقدار integer، یکی از resource آیدی هایی هست که در فایل menu.xml تان تعریف شده.
در واقع این خط کد شرطی، دارد میگوید که اگر اون آیدی برابر بود با action _settings یعنی درصورتی که کاربر روی آیتمی از منو کلیک کرد که آیدی آن action _settings هست این کدها اجرا بشوند.
من این قسمت رو با عبارت switch اصلاح میکنم و متغیر آیدی رو که قبلاً ساخته بودم به آن میدهم.
که بر اساس متغیر آیدی تصمیم بگیرد کدام کیس رو اجرا کند.
بعد عبارت case رو اضافه میکنم و این آیدی رو میاورم بالا اینجا و این خطهای کدم رو هم کات میکنم و اینجا پاست شان میکنم و این خطهای اضافی رو از اینجا پاک میکنم.
خب؛ این کد دقیقاً همان کار قبلی رو انجام میدهد ولی قابلیت این رو دارد که آیتم های دیگری هم به آن اضافه بشود. درواقع میشود چندین کیس با آیدی های مختلف به آن اضافه کرد. خب؛ کار بعدی که میخواهم انجامش بدهم این است که: برمیگردم به فایل تعریف menu اصلی ام و میخواهم آیتم دیگری به آن اضافه کنم.
نام این عنصر item هست و یک آیدی برای آن تنظیم میکنم که با همان جمله همیشگی @ + id/ شروع میشود و بعد مقدار action _about رو به آیدی میدهم.
ویژگی order InCategory رو روی 101 تنظیم میکنم.
که در واقع ترتیب آیتم های منو رو در این منوی خاص مشخص میکند و به همین ترتیب منوی بعدی که میخواهم تعریف کنم میشود 102 و همینطور بعدی 103و غیره.
تایتل آنرا کلمه About میگذارم و بعد از تایپ آن، میخواهم مقدارش را به صورت منبع string دربیاورد، پس با زدن آلت و اینتر extract string resource رو انتخاب میکنم و در پنجره باز شده در قسمت resource name برای نام منبع about رو با حروف کوچک وارد میکنم و اوکی میکنم.
و در آخر مقدار show AsAction رو روی never تنظیم میکنم.
در واقع وقتی که show AsAction روی never تنظیم بشود، همان آیکن سه نقطه معروف نشان داده میشود و اگر روی always تنظیم بشود، آیکنی که ما تنظیم میکنیم نمایش داده میشود.
همچنین توجه کنید در ورژن اورجینال ویژگی show AsAction پیشوند app دارد.
کمی بعد در مورد اینکه چرا از پیشوند app بجای Android استفاده کردم توضیح میدهم.
فعلاً این کد رو اینطوری بنویسید تا بعداً بگویم چرا.
خب؛ حالا من یک آیتم دیگر هم در منو دارم و برمیگردم به کلاس main activity ام و یک عبارت کیس دیگر اضافه میکنم.
این عبارت کیس باید اشاره کند به مقدار R .id.action_about و این کد رو کپی میکنم و یک پیام Snack bar ایجاد میکند و آنرا پاست میکنم این پایین و رشته آنرا به مقدار You selected About تغییر میدهم و کدم رو اجرا میکنم.
وقتی برنامه لود شد، این آیکن رو میزنم و میبینیم که دو تا آیتم ظاهر میشود.
آیتم About رو انتخاب میکنم و پیام Snack bar رو در پایین صفحه نمایش میبینم.
بنابراین میتوانید هر تعداد آیتمی که خواستید به آپشن منوتان اضافه کنید و اگر خواستید میتوانید منو دیگری رو با این منو جایگزین کنید، چرا که می بینید در واقع این منو در کد جاوا دقیقاً در این قسمت لود شده.
و یادتان بماند که متد on CreateOptionsMenu بصورت اتوماتیک موقع بالا آمدن اکتیویتی فراخونی میشود. بنابراین میتوانید، یک کد شرطی بگذارید و تصمیم بگیرید کدام نسخه از منو رو ترجیح میدهید که در اون موقعیت خاص قرار بگیرد. همه اطلاعات منو میتوانند در فایل های .xml تعریف بشوند و بعد فرآیندهای منو رو در کد جاوا کنترل کنید.