ماه اول آموزش بیایید نگاهی دقیق تر به منو بیندازیم. هر دو دستگاه اندروید 2.3 قدیمی و گوشی های اندروید 4.0 جدید در نظر گرفته خواهند شد.

منوی گزینه ها

کلاس مسئول منو است android.view.Menu. هر فعالیت با یک شیء منو مرتبط است. خود منو شامل آیتم های منو (کلاس android.view.MenuItem) و زیر منو (کلاس android.view.SubMenu).

وقتی یک دکمه را فشار می دهید منودر تلفن‌های قدیمی‌تر، مجموعه‌ای از آیتم‌های منو به فعالیت پیوست شده‌اند. منو ممکن است دارای نمادهایی باشد. چنین منوی می تواند شامل شش مورد (به عنوان یک قاعده) باشد. اگر بیش از شش مورد وجود داشته باشد، از منوی توسعه یافته استفاده می شود - در این حالت، به جای مورد ششم، مورد ظاهر می شود. گزینه ها(بیشتر). هنگامی که این مورد فشار داده می شود، یک منوی توسعه یافته با لیستی از مواردی که در قسمت اصلی منوی انتخاب گزینه قرار ندارند، نمایش داده می شود.

هنگامی که منو برای اولین بار باز می شود، اندروید متد را فراخوانی می کند onCreateOptionsMenu()، ارسال یک شی به عنوان پارامتر منو. منوها را می توان به عنوان منابع در یک فایل XML ایجاد کرد یا می توانید از آن استفاده کنید اضافه کردن().

در یک پروژه استاندارد، هنگام انتخاب یک الگوی معمولی، یک منوی یک نقطه ای از قبل خالی است تنظیماتو یک روش فراخوانی برای منو (شما از قبل در این مورد می دانید).

ایجاد منو با استفاده از منابع

کار با منو را از طریق منابع در نظر بگیرید. برای ایجاد یک منو، از منابعی استفاده می شود که باید در یک فایل XML ذخیره شوند. خود فایل باید در پوشه باشد res/menu/پروژه شما منو شامل موارد زیر:

منویی که حاوی آیتم های منو باشد را مشخص می کند. عنصر باید عنصر ریشه در ساختار XML فایل باشد و ممکن است حاوی یک یا چند عنصر باشد و موارد منو را مستقیماً ایجاد می کند. این عنصر می تواند یک عنصر تو در تو داشته باشد برای ایجاد یک زیر منو در صورت تمایل، می توانید از یک محفظه عنصر نامرئی نیز استفاده کنید . این به شما اجازه می دهد تا به برخی از اثرات دست پیدا کنید

فرض کنید تصمیم داریم از منو برای بازی استفاده کنیم. بیایید ایجاد کنیم فایل جدید game_menu.xml:

ما یک منو با دو مورد ایجاد کرده ایم. هر مورد شامل ویژگی های زیر است:

Android:id شناسه آیتم منو که توسط آن برنامه می تواند تشخیص دهد که کاربر چه زمانی آیتم منو را انتخاب می کند android:title متنی که در منو نمایش داده می شود

ویژگی های دیگری برای عنصر وجود دارد مورد، مثلا android:icon="@drawable/home"همچنین نماد آیتم منو را نمایش می دهد و android:enabled="false"به شما امکان می دهد آیتم منو را از دسترس خارج کنید.

صفت android:titleCondensedزمانی استفاده می‌شود که عنوان معمولی آنقدر گسترده باشد که در آیتم منوی انتخابی «جا شود».

صفت android:orderInCategoryترتیب نمایش آیتم های منو MenuItems را مشخص می کند.

هنگام ایجاد منو، به منابع رشته اشاره کردیم @string/new_gameو @string/help. نیاز به اضافه کردن خطوط جدید در فایل strings.xml:

بازی جدید ارجاع

حال باید تغییراتی در کلاس اکتیویتی که منو در آن نمایش داده می شود ایجاد کنیم. برنامه باید منبع منویی را که ایجاد کرده ایم به یک شی برنامه تبدیل کند. برای این منظور روش خاصی وجود دارد. MenuInflater.inflate()، که در یک روش خاص نامیده می شود پاسخ به تماس onCreateOptionsMenu(). این روش برای نمایش یک منو با فشار دادن یک دکمه طراحی شده است. منوروی دستگاه:

@Override boolean عمومی onCreateOptionsMenu( منوی منو) (MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.game_menu، menu); return true;)

پس از چسباندن کد، محیط توسعه از شما می خواهد که فضاهای نام گمشده را وارد کنید.

وارد کردن android.view.Menu. وارد کردن android.view.MenuInflater.

روش onCreateOptionsMenu()این روش اولین ظاهر منو روی صفحه را آغاز می کند و یک شی Menu را به عنوان پارامتر (برای دستگاه های قدیمی تر) می گیرد. می‌توانید پیوندی را در منو ذخیره کنید و تا زمانی که روش وجود دارد، در هر کجای کدتان از آن استفاده کنید onCreateOptionsMenu()دیگر تماس نخواهد گرفت. همیشه باید از پیاده‌سازی کلاس والد این کنترلر استفاده کنید، زیرا در صورت لزوم، به طور خودکار موارد اضافی سیستم را در منو درج می‌کند. در دستگاه های جدید، زمانی که اکتیویتی ایجاد می شود، متد فراخوانی می شود. متد باید مقداری را برگرداند درست است، واقعیتا منو روی صفحه قابل مشاهده باشد.

پس از شروع برنامه، دکمه را فشار دهید منودر شبیه ساز برای مشاهده منوی ایجاد شده.

روش getMenuInflater()نمونه ای از کلاس را برمی گرداند منو بادکننده، که برای خواندن داده های منو از XML استفاده می کنیم.

همانطور که می بینید، منو در پایین صفحه ظاهر می شود. در مجموع می توان شش آیتم منو را به طور همزمان نمایش داد. اگر نقاط بیشتری وجود داشته باشد، پنج نقطه به اضافه نقطه ششم نمایش داده می شود بیشتر، که به شما امکان می دهد بقیه موارد را مشاهده کنید. بیایید آیتم های منو جدید را آزمایش کرده و اضافه کنیم.

بیایید ابتدا شش امتیاز را اضافه کنیم.

بیایید یک مورد دیگر به منو اضافه کنیم تا هفت مورد از آنها وجود داشته باشد.

انتخاب آیتم های منو

ما یاد گرفتیم که چگونه یک منو بسازیم. اما تا اینجا بی فایده است، زیرا آیتم های منو به هیچ وجه به کلیک های ما واکنش نشان نمی دهند. این روش برای رسیدگی به کلیک روی آیتم های منو استفاده می شود. onOptionsItemSelected(). این روش آیتم انتخاب شده توسط کاربر را از طریق شناسایی می کند آیتم منو. اکنون می توانیم با فراخوانی مورد انتخاب شده را تعیین کنیم getItemId()، که شناسه آیتم منو را برمی گرداند. در ادامه از طریق اپراتور تعویضبرای ما باقی می ماند که دستورات لازم را تعریف کنیم:

@Override بولین عمومی onOptionsItemSelected(مورد MenuItem) ( // عملیات برای سوئیچ آیتم منوی انتخاب شده (item.getItemId()) ( case R.id.new_game: newGame(); return true; case R.id.help: showHelp( )؛ بازگشت true؛ پیش‌فرض: بازگشت super.onOptionsItemSelected(مورد)؛ ) ) public void newGame() ( edtext.setText("بازی جدید انتخاب شد"); ) public void showHelp() ( edtext.setText("Help Selected" ) ;)

برنامه را اجرا کنید، منو را فراخوانی کنید و اولین یا دومین مورد منو را انتخاب کنید. یک پیام باید در کادر متن ظاهر شود.

در مثال داده شده getItemId()یک شناسه برای آیتم منوی انتخاب شده درخواست می کند و از طریق عبارت انتخاب سوئیچ با شناسه هایی که در منابع XML تنظیم کرده ایم، شروع به مقایسه می کند. هنگامی که شناسه مورد نیاز پیدا شد، کنترل کننده آیتم منوی داده شده اجرا می شود. اگر برنامه چیزی پیدا نکرد، دستور اجرا می شود پیش فرض، که کلاس فوق العاده را برمی گرداند.

در اندروید 3.0، می توانید ویژگی را اضافه کنید android:onclickدر منابع منو و دیگر نیازی به استفاده از آن ندارید onOptionsItemSelected(). با کمک android:onclickهنگام انتخاب یک آیتم منو می توانید روش مورد نظر را مشخص کنید.

// مشخصه آیتم منو روی android:onClick="onMenuClick" void عمومی درMenuClick(مورد منو آیتم)( edtext.setText("غذا دادن به گربه انتخاب شد") تنظیم شد.

ایجاد منو به صورت برنامه ای

در نظر گرفتن ایجاد نرم افزارمنو برای کامل بودن ما باید چند ثابت برای آیتم های منو تعریف کنیم:

// شناسه برای آیتم های منو خصوصی استاتیک نهایی int IDM_OPEN = 101; خصوصی استاتیک نهایی int IDM_SAVE = 102; بولین عمومی onCreateOptionsMenu (منوی منو) (// افزودن آیتم های منو menu.add(Menu.NONE، IDM_OPEN، Menu.NONE، "Open"); menu.add(Menu.NONE، IDM_SAVE، Menu.NONE، "Save") ;)

در روش اضافه کردن()چهار گزینه وجود دارد:

  • شناسه گروه - به شما امکان می دهد یک آیتم منو را با گروهی از موارد دیگر در این منو مرتبط کنید
  • شناسه مورد برای کنترل کننده رویداد انتخاب آیتم منو
  • ترتیب آیتم در منو - به شما امکان می دهد موقعیت را در منو تعیین کنید. به طور پیش فرض (Menu.NONE یا 0) موارد به ترتیب مشخص شده در کد قرار می گیرند
  • عنوان - متنی که در آیتم منو نمایش داده می شود. می توانید از یک منبع رشته ای استفاده کنید

متد یک شی را برمی گرداند آیتم منو، که می تواند برای تنظیم ویژگی های اضافی مانند نماد تنظیم، کلید میانبر و غیره استفاده شود.

اگر می خواهید یک منو با آیکون ها ایجاد کنید، از روش استفاده کنید setIcon()

Menu.add(Menu.NONE، IDM_OPEN، Menu.NONE، "Open") .setIcon(R.drawable.icon_menu_open);

دوباره به یاد بیاورید که نمادها را فقط می توان به شش آیتم منو (یا پنج مورد، اگر بیش از شش آیتم وجود دارد) اضافه کرد.

روش onCreateOptionsMenuهنگامی که منو ایجاد می شود تنها یک بار توسط سیستم فراخوانی می شود. اگر در حین اجرای برنامه نیاز به به روز رسانی منو دارید، از روش برگشت به تماس استفاده کنید onPrepareOptionsMenu().

هنگامی که یک آیتم منو انتخاب می شود، روش فراخوانی می شود onOptionsItemSelected، که از شی عبور می کند آیتم منو- آیتم منو انتخاب شده توسط کاربر. با استفاده از روش getItemIdمی توانید شناسه آیتم منو انتخاب شده را دریافت کنید. پس از شناسایی آیتم منو، می توانید کدی را برای مدیریت رویداد انتخاب منو بنویسید:

بولین عمومی onOptionsItemSelected(مورد MenuItem) (سوئیچ (item.getItemId()) مورد IDM_OPEN: بازگشت درست؛ مورد IDM_SAVE: بازگشت درست؛ بازگشت نادرست؛ )

کلیدهای میانبر

همچنین می توانید کلیدهای میانبر را برای دسترسی سریع با استفاده از کاراکترهای صفحه کلید با استفاده از چندین روش تنظیم کنید:

  • setAlphabeticShortcut (char) - یک کاراکتر اضافه می کند
  • setNumericShortcut(int) - یک عدد اضافه می کند
  • setShortcut (char، int) - ترکیبی از کاراکتر و عدد را اضافه می کند

به عنوان مثال، اگر کلید میانبر setAlphabeticShortcut ("q") را تنظیم کنید، سپس وقتی منو را باز می کنید (یا در حالی که کلید MENU را نگه دارید)، کلید را فشار دهید ساین آیتم منو را انتخاب می کند. این کلید داغ(یا میانبر صفحه کلید) به عنوان یک راهنمای ابزار در زیر نام آیتم منو نشان داده می شود. کیبوردهای جدید دارای یک کلید جداگانه هستند ctrl، که مانند صفحه کلیدهای معمولی کار می کند.

کلیدهای میانبر را می توان از طریق XML نیز ایجاد کرد: android:alphabeticShortcut="c".

می توانید از طریق روش فعالیت، کلیک ها را مدیریت کنید onKeyShortcut():

@Override بولین عمومی onKeyShortcut (int keyCode، رویداد KeyEvent) ( سوئیچ (keyCode) ( case KeyEvent.KEYCODE_R: Toast.makeText(this, "Reply", Toast.LENGTH_SHORT).show()؛ بازگشت true؛ پیش فرض: بازگشت فوق العاده. onKeyShortcut (کد کلید، رویداد)؛ )

ایجاد یک زیر منو

یک منوی فرعی را می توان به هر منوی اضافه کرد به جز منوی فرعی دیگر. منوی فرعی در روش callback ایجاد می شود onCreateOptionsMenu()با استفاده از روش addSubMenu()که یک شی را برمی گرداند زیر منو. اعتراض کردن زیر منوبا استفاده از روش می توانید موارد اضافی را به این منو اضافه کنید اضافه کردن(). مثلا:

عمومی static نهایی int IDM_HELP = 101; عمومی static نهایی int IDM_NEW = 201; عمومی static نهایی int IDM_OPEN = 202; عمومی static نهایی int IDM_SAVE = 203; عمومی static نهایی int IDM_CUT = 301; عمومی static نهایی int IDM_COPY = 302; عمومی static نهایی int IDM_PASTE = 303; @Override بولین عمومی onCreateOptionsMenu(منوی منو) ( SubMenu SubMenuFile = menu.addSubMenu("File"); subMenuFile.add(Menu.NONE، IDM_NEW، Menu.NONE، "New"); subMenuFile.add(Menu.NONE، IDM_OPEN , Menu.NONE، "Open"); subMenuFile.add(Menu.NONE، IDM_SAVE، Menu.NONE، "Save"); SubMenu subMenuEdit = menu.addSubMenu("Edit")؛ subMenuEdit.add(Menu.NONE، IDM_CUT , Menu.NONE، "Cut")؛ subMenuEdit.add(Menu.NONE، IDM_COPY، Menu.NONE، "Copy"); subMenuEdit.add(Menu.NONE، IDM_PASTE، Menu.NONE، "Paste")؛ منو. add(Menu.NONE، IDM_HELP، Menu.NONE، "Help"); return super.onCreateOptionsMenu(menu); ) @Override بولین عمومی onOptionsItemSelected(مورد MenuItem) (پیام CharSequence؛ سوئیچ (item.getItemId()W) ( مورد IDM_NE : message = "مورد جدید انتخاب شد"؛ break؛ case IDM_OPEN: message = "Open item انتخاب شد"؛ break; case IDM_SAVE: message = "Save item Selected"؛ break؛ case IDM_CUT: message = "Cut item انتخاب شد"؛ break; مورد IDM_COPY:message= "کپی مورد انتخاب شده"؛ زنگ تفريح؛ case IDM_PASTE: message = "Paste انتخاب شد"; زنگ تفريح؛ case IDM_HELP: message = "مورد راهنما انتخاب شد"; زنگ تفريح؛ پیش فرض: return false; ) // نمایش اعلان در مورد آیتم منوی انتخابی Toast toast = Toast.makeText(this, message, Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); بازگشت درست؛ )

اکنون وقتی یک آیتم منو را انتخاب می کنید، پنجره دیگری با یک زیر منو ظاهر می شود. خودت آن را امتحان کن.

افزودن چک باکس ها و دکمه های رادیویی

می توانید چک باکس ها یا دکمه های رادیویی را به آیتم های منو اضافه کنید. برای افزودن یک چک باکس یا دکمه رادیویی برای یک آیتم منو، باید از روش استفاده کنید setCheckable():

آیتم MenuItem = menu.add(0، IDM_FORMAT_BOLD، 0، "پررنگ"); item.setCheckable(true);

اگر نیاز به اضافه کردن چندین آیتم منو با چک باکس یا دکمه های رادیویی وجود دارد، می توانید با ایجاد یک شناسه جداگانه، آنها را در گروه های منو ترکیب کنید. آیتم منو از طریق روش به گروه اضافه می شود اضافه کردن()، شناسه گروه منو را به عنوان اولین پارامتر ارسال می کند. فرض کنید برای تنظیم رنگ، شناسه هایی را برای گروه منوی Color و آیتم های منو اعلام کردیم:

عمومی استاتیک نهایی int ID_COLOR_GROUP = 400; عمومی static نهایی int ID_COLOR_RED = 401; عمومی static نهایی int ID_COLOR_GREEN = 402; عمومی static نهایی int IDM_COLOR_BLUE = 403;

اکنون برای ایجاد یک گروه منو با چک باکس، باید به هر آیتم منو یک شناسه گروه اختصاص دهید و متد را فراخوانی کنید. setGroupCheckable()برای کل گروه (در این حالت نیازی به فراخوانی متد نیست setCheckable()برای هر آیتم منو):

SubMenu subMenuColor = menu.addSubMenu("Color"); subMenuColor.add(IDM_COLOR_GROUP، IDM_COLOR_RED، Menu.NONE، "قرمز"); subMenuColor.add(IDM_COLOR_GROUP، IDM_COLOR_GREEN، Menu.NONE"سبز"); subMenuColor.add(IDM_COLOR_GROUP، IDM_COLOR_BLUE، Menu.NONE، "آبی"); subMenuColor.setGroupCheckable(IDM_COLOR_GROUP، درست، نادرست)؛

در روش setGroupCheckable()سه گزینه:

  • اولین پارامتر ID گروه منو است.
  • اگر دکمه های رادیویی یا چک باکس ها در گروه مجاز باشند، پارامتر دوم درست است.
  • پارامتر سوم - انتخاب واحد (درست) یا چندگانه (نادرست) آیتم های منو را تنظیم می کند. این تنظیم در واقع ظاهر منو را تعیین می کند - منویی با دکمه های رادیویی یا کادرهای انتخاب خواهد بود.

    برای کنترل وضعیت چک باکس ها و دکمه های رادیویی در کنترل کننده رویداد انتخاب آیتم های منو، موارد زیر را بنویسید:

    @Override boolean public onOptionsItemSelected(MenuItem item) ( پیام CharSequence؛ سوئیچ (item.getItemId()) ( ... case IDM_COLOR_RED: // معکوس کردن وضعیت چک باکس item.setChecked(!item.isChecked())؛ پیام = "رنگ قرمز"؛ شکستن؛ پیش‌فرض: بازگشت نادرست؛ )

    پروژه را اجرا کنید، منو را فراخوانی کنید و آیتم منو را انتخاب کنید رنگ. شما یک زیر منو با سه آیتم (قرمز، سبز، آبی) به شکل پرچم خواهید داشت. وضعیت چک باکس ها و سوئیچ ها در کد برنامه پردازش می شود و با فراخوانی مجدد منو ذخیره می شود.

    می‌توانید بلافاصله از طریق متد setIntent() یک intent به آیتم منوی انتخابی اختصاص دهید، که با کلیک روی این آیتم فعال می‌شود، اگر این رویداد توسط کنترل‌کننده‌های onMenuItemClickListener (منسوخ شده) یا onOptionsItemSelected شناسایی نشده باشد. پس از راه اندازی، intent به متد startActivity ارسال می شود.

    MenuItem.setIntent(new Intent(this, MyOtherActivity.class));

    باز کردن یا بستن یک منو از طریق برنامه

    اگر به دلایلی نیاز دارید که منو را به صورت برنامه ریزی شده باز کنید (مثلاً برای اهداف نمایشی)، از روش استفاده کنید openOptionsMenu():

    OpenOptionsMenu();

    برای بستن منو به صورت برنامه ای، از روش استفاده کنید closeOptionsMenu()با این حال، من یک فراخوانی مکرر به روش دارم openOptionsMenu()همچنین منو را می بندد.

    حذف برنامه‌ای یک آیتم منو

    فرض کنید یک آیتم منو را در یک فایل xml تعریف کرده ایم:

    برای حذف یک آیتم منوی غیر ضروری از برنامه cat خود، باید از طریق این روش به آیتم منو دسترسی داشته باشیم. findItem()و آن را نامرئی کنید. ارجاع به شی Menu باید به متد ارسال شود onCreateOptionsMenuبه طوری که برنامه از تغییر در ترکیب منو مطلع شود.

    // متغیر کلاس منوی منو; @Override بولین عمومی onCreateOptionsMenu (منوی منو) ( super.onCreateOptionsMenu(menu); // یک مرجع به شیء ما ارسال کنید this.menu = منو؛ getMenuInflater().inflate(R.menu.test، menu)؛ بازگشت true؛ ) / / روی دکمه public void onClick(View v) کلیک کنید (اگر (menu != null) ( // مورد دلخواه را پیدا کنید MenuItem item_dog = menu.findItem(R.id.action_dog); // آن را نامرئی کنید item_dog.setVisible(false )))

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

    باید وضعیت آیتم منو را به خاطر بسپاریم و آن را در یک شی از نوع Bundle در متد ذخیره کنیم onSaveInstanceState، و در روش onCreate()حالت ذخیره شده را واکشی کنید و به متد منتقل کنید رویPrepareOptionsMenu، که قبل از نمایش منو روی صفحه فراخوانی می شود:

    بسته en.alexanderklimov.test; وارد کردن android.app.Activity; وارد کردن android.os.Bundle; وارد کردن android.view.Menu; وارد کردن android.view.MenuItem; وارد کردن android.view.View; کلاس عمومی TestActivity فعالیت را گسترش می دهد ( منوی منو؛ ذخیره شده بولی MenuDogIsVisible؛ رشته ثابت نهایی KEY_MENU_DOG = "KEY_MENU_DOG"؛ @Override public void onCreate(Bundle savedInstanceState) ( super.onViCreate(savedInstanceSt. داده های مشاهده آیتم منو if (savedInstanceState != null) ( savedMenuDogIsVisible = savedInstanceState.getBoolean(KEY_MENU_DOG، true); ) ) @Override بولین عمومی onCreateOptionsMenu(Menu menu) (super.onMenumen(Innumenufleate menu) inflate(R.menu.test, menu); return true; ) public void onClick(View v) ( if (menu != null) ( MenuItem item_dog = menu.findItem(R.id.action_dog); // hide آیتم منو item_dog.setVisible(false); ) ) @Override void محافظت شده onSaveInstanceState(Bundle outState) ( // TODO روش تولید خودکار روش خرد super.onSaveInstanceState(outState)؛ if (menu != null) ( منوی آیتم. findItem(R.id.action_dog); // ذخیره وضعیت فعلی آیتم منو - true یا false outState putBoolean(KEY_MENU_DOG, item_dog.isVisible()); ) ) @Override بولین عمومی onPrepareOptionsMenu(منوی منو) ( if (savedMenuDogIsVisible != null) ( MenuItem item_dog = menu.findItem(R.id.action_dog)؛ // قبل از نمایش وضعیت دلخواه منوی item_dog.setMesVisible) ; ) بازگشت super.onPrepareOptionsMenu(menu); ) )

    تشخیص وجود دکمه منو

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

    اگر (Build.VERSION.SDK_INT<= 10 || (Build.VERSION.SDK_INT >= 14 && ViewConfiguration.get(this) .hasPermanentMenuKey())) ( // کلید منو موجود است Toast.makeText(این، "دکمه منو است"، Toast.LENGTH_LONG).show(); ) other ( // منوی وجود ندارد کلید Toast.makeText(این، "بدون دکمه منو"، Toast.LENGTH_LONG).show();)

    نشانه گذاری برای منو

    در دستگاه های مدرن، منو بخشی از ActionBar. و می توانید طرح منو از طریق XML سفارشی کنید.

    فرض کنید این گزینه را انتخاب کرده اید:

    در صفت showAsActionاز ارزش استفاده نکنید هرگز، در غیر این صورت نشانه گذاری را نخواهید دید. خود نشانه گذاری از طریق ویژگی مشخص می شود actionLayout. کد نشانه گذاری:

    منو به صورت تکه تکه

    یک منو نه تنها می تواند بخشی از یک فعالیت، بلکه بخشی از یک قطعه باشد. اصل عملکرد عملاً یکسان است. قطعه دارای روش مربوطه است.

    @Override public void onCreateOptionsMenu(منوی منو، MenuInflater inflater) ( super.onCreateOptionsMenu(menu، inflater); inflater.inflate(R.menu.fragment_crime_list، منو)؛ )

    FragmentManagerمسئول تماس onCreateOptionsMenu()هنگامی که فعالیت یک تماس پاسخ دریافت می کند onCreateOptionsMenu()از سیستم شما باید صریحا به مدیر بگویید FragmentManagerکه قطعه باید فراخوانی شود onCreateOptionsMenu(). برای این، روش نامیده می شود setHasOptionsMenu():

    // در کد قطعه @Override public void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState)؛ setHasOptionsMenu(true)؛ getActivity().setTitle(R.string.cat)؛ ...)

قبل از Honeycomb (اندروید 3.0)، همه دستگاه‌های اندرویدی دارای دکمه «منو» در زیر صفحه نمایش بودند. توسعه‌دهندگان می‌توانستند آن‌طور که صلاح می‌دانستند از آن استفاده کنند و رابط‌های بسیاری از برنامه‌ها حول این دکمه ساخته شده‌اند. لانه زنبوری تبلت محور یک قدم از دکمه های مکانیکی (و لمسی) فاصله گرفته است و در این راستا در سومین نسخه های اندرویدکلاس ActionBar ظاهر شد که این امکان را به کاربر می داد دسترسی سریعبه تنظیمات برنامه از طریق یک پنل خاص به نام نوار عمل. مطابق با توسعه دهندگان گوگل Action Bar آینده است و برنامه نویسان باید از دکمه "menu" استفاده نکنند. بازار در حال حاضر تحت سلطه تلفن های هوشمند با مکانیکی یا دکمه لمسیزیر صفحه نمایش، اما با ظهور ساندویچ بستنی، ممکن است وضعیت به طرز چشمگیری تغییر کند. برای شما به عنوان یک توسعه دهنده مهم است که از قبل برای ظاهر چنین دستگاه هایی آماده شوید و امروز از مفهوم نوار اکشن استفاده کنید.

در نگاه اول ممکن است به نظر برسد که استفاده از Action Bar هنگام توسعه برنامه هایی برای Android 2.x که هنوز این نوار در آن پیاده سازی نشده است، مشکلاتی را ایجاد می کند. با این حال، در اینجا هیچ مشکلی وجود ندارد. هیچ کس شما را از ادامه استفاده از دکمه "منو" در دستگاه هایی که در آن وجود دارد منع نمی کند، افزودن یک Action Bar فقط به نوشتن چند خط کد نیاز دارد.

اگر بخواهم این مقاله را در یک جمله خلاصه کنم، این خواهد بود: targetSdkVersion را روی 14 تنظیم کنید و showAsAction="ifRoom" را روی آیتم های منو که باید در Action Bar رندر شوند تگ کنید.".

رد نهایی منوی تنظیمات در اندروید

فقط توقف استفاده از دکمه "منو" کافی نیست، بلکه باید این مفهوم را به طور کامل از ذهن خود خارج کنید. منوها را ایجاد نکنید، تمام دکمه های لازم را مستقیماً در داخل فعالیت ها ایجاد کنید. اگر برخی از عملکردها در پانل مناسب نیستند، آنها را در یک منوی کشویی اضافی قرار دهید (سرریز عمل). تصویر بالا یک نوار عمل با دکمه جستجو و یک منوی اضافی در سمت راست نوار را نشان می دهد.

اگر برنامه شما برای نسخه قدیمیاندروید (که به طور سنتی از یک منو استفاده می کند)، پس از راه اندازی بر روی تبلت اندروید 3، پنلی در پایین صفحه نمایش داده می شود که سه دکمه موجود در گوشی های شعبه دوم را شبیه سازی می کند.

اصطلاحات کاملاً گیج کننده است، اما منوی کشویی (سرریز عمل) مفهومی کاملاً متفاوت از استفاده از منوی تنظیمات ساده را پیشنهاد می کند. به جای اینکه یک منو به عنوان یک مخزن برای تمام تنظیمات برنامه در نظر بگیرید، یک پنل ایجاد می کنید که در آن تنظیمات اصلی را قرار می دهید. همه چیز ثانویه در منوی کشویی خارج می شود، که با کلیک بر روی دکمه با سه نقطه (دکمه Action overflow) در سمت راست پانل فراخوانی می شود.

دکمه سرریز عمل

اگر برنامه‌های نوشته شده برای Android 2.3 و پایین‌تر را روی دستگاه‌هایی بدون دکمه در زیر صفحه اجرا کرده‌اید (به عنوان مثال، در تبلت با Honeycomb یا Galaxy Nexus)، ممکن است متوجه شده باشید که یک دکمه سرریز Action در کنار تصویر ظاهر می‌شود. سه دکمه روی پانل در پایین (سه نقطه روی هم). این یک سازش است، اما خیلی خوب نیست. در برنامه هایی که اصلا از منوی تنظیمات استفاده نمی کنند، این دکمه هیچ کاری نمی کند و باعث آزار کاربران می شود. بنابراین، یک راه حل بسیار خوب می تواند دنبال شود نسخه اندرویدو اگر برنامه شما تحت اندروید 3.0 و بالاتر اجرا می شود، این دکمه را از نوار ناوبری بردارید و از Action Bar استفاده کنید. این رویکرد به شما امکان می دهد برنامه را با دستگاه های قدیمی سازگار نگه دارید و آن را برای دستگاه های جدید جذاب تر کنید.

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

  • اگر minSdkVersion یا targetSdkVersion را روی مقداری بیشتر از 11 تنظیم کنید، سیستم این دکمه را اضافه نمی کند.
  • از طرف دیگر، سیستم این دکمه را هنگامی که برنامه را روی اندروید 3.0 و بالاتر اجرا می کنید ایجاد می کند.
  • تنها استثنا زمانی است که minSdkVersion را روی 10 یا کمتر تنظیم کنید. targetSdkVersion به 11، 12 یا 13 است و از ActionBar استفاده نمی کند، سیستم این دکمه را در تلفن ها (نه تبلت ها) در زیر اضافه می کند. کنترل اندروید 4.0 و بالاتر این استثنا بر اساس ایده زیر است: اگر شما در حال توسعه یک برنامه برای تلفن های شاخه دوم و برای تبلت های سوم هستید، فرض می کنید که گوشی ها باید دکمه منو داشته باشند، اما تبلت ها ندارند.

بنابراین، اگر می خواهید عملکرد سرریز یک دکمه را در نوار ناوبری غیرفعال کنید، باید targetSdkVersion را روی 14 تنظیم کنید (شما می توانید بیش از کم ارزشبه طوری که برنامه می تواند در دستگاه های قدیمی تر اجرا شود).

انتقال به مفهوم نوار عمل

اگر فعالیت‌هایی دارید که از منوی گزینه‌ها استفاده می‌کنند (ایجاد شده با onCreateOptionsMenu())، سپس با حذف دکمه از نوار پیمایش (با تنظیم targetSdkVersion=14) باید یک وسیله جایگزین برای دسترسی به گزینه‌ها در اختیار کاربر قرار دهید. خوشبختانه، شما مجبور نیستید کار زیادی انجام دهید زیرا سیستم به طور خودکار یک نوار عمل ایجاد می کند.

showAsAction="ifRoom" را به برچسب های خود اضافه کنید عناصری که می خواهید در نوار اکشن قرار دهید. اگر مطمئن نیستید که کدام عنصر را در نوار اقدام قرار دهید، به راهنمای نوار اقدام Android Design مراجعه کنید.

برای اینکه درک برنامه خود را جامع تر کنید، توصیه می کنیم از آیکون هایی استفاده کنید تیم Android UX. بایگانی .

نحوه حذف Action Bar از برنامه اندروید

اگر به نوار اکشن نیاز ندارید، می توانید آن را از هر فعالیتی یا حتی از برنامه حذف کنید. این ممکن است برای بازی‌ها و برنامه‌هایی که از منوی تنظیمات استفاده نمی‌کنند مرتبط باشد. می‌توانید نوار اقدام را با استفاده از تم Theme.Holo.NoActionBar یا Theme.DeviceDefault.NoActionBar حذف کنید.

اگر می خواهید از این طرح ها استفاده کنید اما نگه دارید سازگار با عقب، می توانید از سیستم مدیریت منابع برای تنظیم تم های مختلف استفاده کنید نسخه های مختلفبستر، زمینه. این موضوع با جزئیات بیشتری پوشش داده شده است اینجا. شما باید تم خود را ایجاد کنید که از تم ها به ارث می رسد پلتفرم های مختلفبسته به نسخه فعلی

به عنوان مثال، می توانید یک موضوع را برای برنامه خود اعلام کنید

(یا برای یک فعالیت خاص در یک برچسب ).

برای دستگاه‌های دارای Android 2، موضوع زیر را در res/values/themes.xml قرار دهید.



برای Honeycomb، موضوع زیر را در res/values-v11/themes.xml قرار دهید.



در هنگام راه اندازی، بسته به نسخه API، سیستم موضوع مناسب را انتخاب می کند.

نتیجه

بیایید ایده ها و نکات کلیدی مقاله را مرور کنیم:

  • در اندروید جدیدممکن است دستگاه ها دکمه "منو" نداشته باشند، بنابراین هنگام توسعه برنامه ها، بهتر است به هیچ وجه از استفاده از آن خودداری کنید.
  • targetSdkVersion = 14 را تنظیم کنید و برنامه خود را در اندروید 4.0 تست کنید.
  • تگ showAsAction="ifRoom" را به آن اضافه کنید یک آیتم منو اگر می خواهید به طور خودکار به نوار اقدام برود.
  • اگر برنامه شما از ActionBar استفاده نمی کند، می توانید آن را با استفاده از تم های Theme.Holo.NoActionBar و Theme.DeviceDefault.NoActionBar حذف کنید.

اندروید از چندین نوع منو پشتیبانی می کند. اول - یک دکمه جداگانه روی گوشی وجود دارد منو(در گوشی های قدیمی)، با فشار دادن آن منو ظاهر می شود. در دستگاه‌های جدید، یک دکمه جداگانه حذف شد و یک نماد منو جایگزین آن شد سهنقاط در جهت عمودی نوع دوم یک منوی زمینه است که با فشار دادن و نگه داشتن انگشت خود روی صفحه نمایش ظاهر می شود جای مناسب(همچنین می توانید دکمه مرکزی گوشی خود را فشار داده و نگه دارید). منوی زمینهبه نوبه خود ممکن است یک منوی فرعی داشته باشد. امروز با منوی نوع اول آشنا می شویم. این مقاله کار با منو در دستگاه‌های جدید دارای اندروید 4.0 و بالاتر را پوشش می‌دهد.

در قالب فعالیت خالیهیچ منوی وجود ندارد، بنابراین ما خودمان آن را ایجاد خواهیم کرد. این به شما کمک می کند تا درک کنید که چگونه کار می کند و یک ایده کلی از پروژه به دست آورید. برای مدیریت انتخاب آیتم های منو، لازم نیست نام کلاس ها، روش ها و کدها را به خاطر بسپارید. در قالب های دیگر، منو ساخته می شود و می توانید بلافاصله از آن استفاده کنید.

ایجاد کردن پروژه جدیدمستقر فعالیت خالیو آن را اجرا کنید. هنوز منویی وجود ندارد.

چندین منبع رشته ای در یک فایل ایجاد کنید res/values/strings.xml، که مسئول آیتم های منو خواهد بود:

تنظیمات گربه گربه بچه گربه

حالا یک پوشه جدید بسازید منودر پوشه پاسخ پاسخ, | جدید | فهرست راهنما). سپس یک فایل در پوشه ایجاد شده ایجاد کنید menu_main.xml- نام نشان می دهد که منو به فعالیت اصلی تعلق دارد فعالیت اصلی(روی پوشه کلیک راست کنید منو | جدید | فایل منبع منو). اگر یک برنامه با چندین صفحه ایجاد کنید، هر فعالیت یک منوی جداگانه با تنظیمات خاص خود خواهد داشت. در حین باز کردن فایل menu_main.xmlو کد ما را به قالب حاصل اضافه کنید:

بیایید فایل را باز کنیم فعالیت اصلی. در حال حاضر فقط یک روش دارد. onCreate(). بیایید یک روش جدید اضافه کنیم onCreateOptionsMenu(). دقیقا این روشمسئول ظاهر منو در فعالیت است. از منوی استودیو انتخاب کنید کد| و در پنجره بعدی شروع به تایپ نام متد با حروف اول کنید. ابتدا می توان وارد کرد حروف بزرگ، یعنی ocom( o n سینرخ Oگزینه ها م enu) برای یافتن سریع رشته مورد نظر. دکمه را فشار می دهیم خوبو قطعه کار را می گیریم.

@Override بولین عمومی onCreateOptionsMenu (منوی منو) (بازگردان super.onCreateOptionsMenu(منو)؛ )

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

@Override بولین عمومی onCreateOptionsMenu (منوی منو) (getMenuInflater().inflate(R.menu.menu_main، menu)؛ بازگشت true;)

در روش باد کردن ()شما به یک منبع منو اشاره می کنید ( R.menu.menu_main) و شی کلاس منو.

در انگلیسی، "inflate" به inflate ترجمه می شود، i.e. با طراحی توسعه دهندگان اندروید، ما به نوعی یک شی را با داده، به عنوان مثال، یک منو، پر می کنیم. اما در واقع کلمه «باد کردن» از این عبارت می آید تخت- به آپارتمان یک سنت قدیمی برای فرستادن اولین گربه به آپارتمان وجود دارد که تمام گوشه و کنار خانه را بررسی می کند و رضایت خود را برای زندگی در آن اعلام می کند. بنابراین داده های فایل XML را در شی MenuInflater اجرا می کنیم.

پروژه را اجرا کنید. اکنون در سمت راست هدر نمادی از سه نقطه را خواهید دید که به صورت مرتب شده اند خط عمودی. برای مشاهده آیتم منو روی نماد کلیک کنید تنظیمات.

همانطور که حدس زدن عنصر دشوار نیست موردمسئول یک آیتم منو جداگانه است. بیایید سه مورد دیگر را به همین روش اضافه کنیم و فقط شناسه و متن منو را تغییر دهیم:

پروژه را اجرا کنید و دوباره منو را باز کنید. سه مورد جدید را مشاهده خواهید کرد.

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

و در نهایت یک ویژگی مهم برنامه:showAsActionرفتار منو را در آن تعریف می کند ActionBar. معنی هرگزبه این معنی است که آیتم منو نباید در هدر، بلکه فقط در منوی بازشو نمایش داده شود، یعنی. پشت سه نقطه باشید اگر مقدار را تعیین کنید همیشه، سپس اشاره کنید تنظیماتبلافاصله در هدر برنامه شما ظاهر می شود. همچنین مقادیر موجود ifRooms, با متنو collapseActionView. خودت آن را امتحان کن. مثلا، ifRoomدر صورت اجازه فضا، یک آیتم منو را نمایش می دهد. اگر امتیازهای زیادی وجود داشته باشد، آنها فقط در راه هستند. به عنوان یک قاعده، این گزینه یک کلمه یا نماد بسیار کوتاه را برای عملیات مکرر نمایش می دهد تا از کلیک های غیر ضروری روی سه نقطه جلوگیری شود.

به صفت توجه کنید برنامه:showAsAction، که متعلق به فضای نام است xmlns:app="http://schemas.android.com/apk/res-auto". زمانی بود که چنین فضای نامی وجود نداشت و پروژه ها از این ویژگی استفاده می کردند android:showAsActionاز فضای نام استاندارد اگر استودیو به خطا فحش داد، کد را ویرایش کنید.

تا زمانی که آیتم های منو اجرا شوند کار مفید. هر کلیک بر روی آیتم به سادگی منو بدون عواقب قابل مشاهده بسته می شود. ما هنوز کدی برای مدیریت کلیک ها ننوشته ایم.

انتخاب آیتم های منو

ما یاد گرفتیم که چگونه یک منو بسازیم. اما تا اینجا بی فایده است، زیرا آیتم های منو به هیچ وجه به کلیک های ما واکنش نشان نمی دهند. روش دیگری برای مدیریت کلیک های منو استفاده می شود. onOptionsItemSelected(). بیایید روشی را مانند مثال قبلی اضافه کنیم. بیایید آماده سازی را انجام دهیم.

@Override بولین عمومی onOptionsItemSelected(مورد MenuItem) ( بازگشت super.onOptionsItemSelected(item); )

پارامتر موردمسئول آیتم منو شما باید شناسه منو را از طریق روش دریافت کنید getItemId()و یک کد برای آن وارد کنید. از آنجایی که منو معمولاً از چندین مورد تشکیل شده است، استفاده از ساختارها راحت است اگر دیگرییا تعویض. برای نمایش اطلاعات از برچسب متنی استفاده می کنیم. یک جزء به صفحه فعالیت اضافه کنید مشاهده متن. می توانید از موجود استفاده کنید مشاهده متنبا برچسب "Hello World!"، فقط به آن شناسه بدهید.

android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="سلام دنیا!"/>

بیایید کد را به فضای خالی مورد انتخابی منو اضافه کنیم:

@Override بولین عمومی onOptionsItemSelected(مورد MenuItem) ( // دریافت شناسه مورد انتخابی منو int id = item.getItemId()؛ TextView infoTextView = (TextView) findViewById(R.id.textView)؛ // عملیات برای انتخاب شده سوئیچ آیتم منو ( id) ( case R.id.action_cat1: infoTextView.setText("شما یک گربه را انتخاب کردید!"); بازگشت true؛ مورد R.id.action_cat2: infoTextView.setText("شما یک گربه را انتخاب کردید!"); بازگشت true؛ case R. id.action_cat3: infoTextView.setText("شما یک بچه گربه را انتخاب کرده اید!")؛ بازگشت true؛ پیش فرض: بازگشت super.onOptionsItemSelected(item); ) )

برنامه را اجرا کنید، منو را فراخوانی کنید و هر مورد از منو را انتخاب کنید. یک پیام باید در کادر متن ظاهر شود.

وجود دارد راه جایگزیناز طریق XML مشابه مدیریت کلیک روی دکمه (از Android 3.0). می توانید ویژگی اضافه کنید android:onclickدر منابع منو و نیازی به استفاده از روش فراخوانی ندارید onOptionsItemSelected(). با کمک android:onclickهنگام انتخاب یک آیتم منو می توانید روش مورد نظر را مشخص کنید. این ویژگی را به آیتم اضافه کنید تنظیمات

حال در کد فعالیت موارد زیر را می نویسیم:

// ویژگی آیتم منوی تنظیمات روی android:onClick="onSettingsMenuClick" void عمومی onSettingsMenuClick(مورد MenuItem) ( TextView infoTextView = (TextView) findViewById(R.id.textView) تنظیم شده است؛ infoTextView.setText بهتر است یک گربه را انتخاب کنم"))

سوئیچ ها

ظاهر آیتم های منو را می توان به نمای با دکمه های رادیویی تغییر داد. برای انجام این کار، یک عنصر اضافه کنید گروهبا صفت android:checkableBehavior="single":

من نکته زیادی در این حالت نمی بینم. و ما آن را در نظر نخواهیم گرفت.

حالت طراحی

Android Studio 2.2 یک حالت گرافیکی برای ساخت منوها اضافه کرد که شبیه یک نوار ابزار برای افزودن اجزای جدید به صفحه نمایش است. نوار منو از چهار عنصر تشکیل شده است: آیتم منو, جستجوی مورد, منو, گروه.

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