първия месец на обучение. Нека да разгледаме по-отблизо менюто. Ще бъдат взети предвид както стари устройства с Android 2.3, така и нови телефони с Android 4.0.

Меню с опции

Класът отговаря за менюто android.view.Menu. Всяка дейност е свързана с един обект от менюто. Самото меню съдържа елементи от менюто (клас android.view.MenuItem) и подменю (клас android.view.SubMenu).

Когато натиснете бутон Менюна по-стари телефони набор от елементи от менюто се появява прикачен към дейността. Менюто може да съдържа икони. Такова меню може да съдържа шест елемента (като правило). Ако има повече от шест елемента, се използва разширеното меню - в този случай вместо шестия елемент се появява елементът Настроики(Повече ▼). Когато се натисне този елемент, се показва разширено меню със списък с елементи, които не се побират в основната част на менюто за избор на опции.

Когато менюто се отвори за първи път, Android извиква метода onCreateOptionsMenu(), предавайки обект като параметър Меню. Менютата могат да бъдат създадени като ресурси в XML файл или можете да използвате добави ().

В стандартен проект при избора на обикновен шаблон вече има празно място за едноточково меню Настройкии извикване на метод за менюто (вече знаете за това).

Създаване на меню с помощта на ресурси

Помислете за работа с менюто чрез ресурси. За създаване на меню се използват ресурси, които трябва да се съхраняват в XML файл. Самият файл трябва да е в папката res/меню/вашият проект. Менюто се състои от следните елементи:

Указва менюто, което ще съдържа елементите от менюто. елемент трябва да бъде основният елемент в XML структурата на файла и може да съдържа един или повече елементи и Създава директно елементи от менюто. Този елемент може да има вложен елемент за създаване на подменю По желание можете също да използвате контейнер за невидими елементи . Това ви позволява да постигнете някои ефекти

Да предположим, че решим да използваме менюто за някаква игра. Да творим нов файл game_menu.xml:

Създадохме меню с два елемента. Всеки елемент включва следните атрибути:

Android:id Идентификатор на елемента от менюто, по който приложението може да разпознае, когато потребителят избере елемента от менюто android:title Текстът, който ще се показва в менюто

Има и други атрибути за елемента вещ, например android:icon="@drawable/home"също ще покаже иконата за елемента от менюто и android:enabled="false"ви позволява да направите елемента от менюто недостъпен.

Атрибут android:titleCondensedизползва се, когато обикновеното заглавие е твърде широко, за да се "побере" в избрания елемент от менюто.

Атрибут android:orderInCategoryдефинира реда, в който се показват елементите от менюто на MenuItems.

Когато създавахме менюто, посочихме ресурси за низове @низ/нова_играи @низ/помощ. Трябва да добавите нови редове във файла strings.xml:

Нова игра справка

Сега трябва да направим промени в класа на дейност, в който ще се показва менюто. Програмата трябва да преобразува ресурса от менюто, който създадохме, в програмен обект. За тази цел има специален метод. MenuInflater.inflate(), който се извиква в специален метод обратно повикване onCreateOptionsMenu(). Този метод е предназначен да показва меню при натискане на бутон. МЕНЮна устройство:

@Override public boolean onCreateOptionsMenu( меню меню) ( MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.game_menu, menu); return true; )

След като поставите кода, средата за разработка ще ви помоли да импортирате липсващите пространства от имена.

Импортиране на android.view.Menu; импортиране на android.view.MenuInflater;

Метод onCreateOptionsMenu()методът инициира първото появяване на менюто на екрана и приема обект Menu като параметър (за по-стари устройства). Можете да запазите връзка към менюто и да я използвате навсякъде във вашия код, стига да е методът onCreateOptionsMenu()няма да бъде повикан отново. Винаги трябва да използвате изпълнението на родителския клас на този манипулатор, тъй като той автоматично включва допълнителни системни елементи в менюто, ако е необходимо. В новите устройства методът се извиква при създаване на дейността. Методът трябва да върне стойност вярноза да направите менюто видимо на екрана.

След стартиране на програмата натиснете бутона МЕНЮна емулатора, за да видите създаденото меню.

Метод getMenuInflater()връща екземпляр на класа menuinflater, който използваме за четене на данни от менюто от XML.

Както можете да видите, менюто се появява в долната част на екрана. Общо шест елемента от менюто могат да бъдат показани едновременно. Ако има повече точки, ще се покажат пет точки плюс шестата точка | Повече ▼, което ще ви позволи да видите останалите елементи. Нека тестваме и добавяме нови елементи от менюто.

Нека първо добавим шест точки.

Нека добавим още един елемент към менюто, така че да има седем от тях.

Избор на елементи от менюто

Научихме как да съставим меню. Но засега е безполезно, тъй като елементите от менюто не реагират по никакъв начин на нашите кликвания. Методът се използва за обработка на кликвания върху елементи от менюто. onOptionsItemSelected(). Методът разпознава елемента, избран от потребителя чрез Елемент от менюто. Вече можем да определим избрания елемент чрез извикване getItemId(), който връща идентификатора на елемента от менюто. По-нататък чрез оператора превключвателостава да дефинираме необходимите команди:

@Override public boolean onOptionsItemSelected(MenuItem item) ( // Операции за избрания превключвател на елемент от менюто (item.getItemId()) ( case R.id.new_game: newGame(); return true; case R.id.help: showHelp( ) ; return true; default: return super.onOptionsItemSelected(item); ) ) public void newGame() ( edtext.setText("Избрана нова игра"); ) public void showHelp() ( edtext.setText("Избрана помощ") ;)

Стартирайте приложението, извикайте менюто и изберете първия или втория елемент от менюто. В текстовото поле трябва да се появи съобщение.

В дадения пример getItemId()иска идентификатор за избрания елемент от менюто и започва да сравнява чрез оператора за избор на превключвател с идентификаторите, които задаваме в XML ресурсите. Когато се намери необходимия идентификатор, манипулаторът за дадения елемент от менюто се изпълнява. Ако програмата не намери нищо, операторът се изпълнява по подразбиране, което връща супер класа.

В Android 3.0 можете да добавите атрибута android:onclickв ресурсите на менюто и вече не е необходимо да използвате onOptionsItemSelected(). С помощ android:onclickможете да посочите желания метод, когато избирате елемент от менюто.

// атрибутът на елемент от менюто е зададен на android:onClick="onMenuClick" public void onMenuClick(MenuItem item)( edtext.setText("Нахрани избраната котка"); )

Програмно създаване на меню

Обмисли създаване на софтуерменю за пълнота. Ще трябва да дефинираме няколко константи за елементите от менюто:

// идентификатори за елементи от менюто private static final int IDM_OPEN = 101; частен статичен финал int IDM_SAVE = 102; public boolean onCreateOptionsMenu(Menu menu) ( // добавяне на елементи от менюто 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, "Отвори") .setIcon(R.drawable.icon_menu_open);

Спомнете си отново, че иконите могат да се добавят само към шест елемента от менюто (или пет, ако има повече от шест елемента).

Метод onCreateOptionsMenuизвиква се от системата само веднъж при създаване на менюто. Ако трябва да актуализирате менюто, докато програмата работи, използвайте метода за обратно извикване onPrepareOptionsMenu().

Когато е избран елемент от менюто, методът се извиква onOptionsItemSelected, която преминава през обекта Елемент от менюто- елемент от менюто, избран от потребителя. Използване на метода getItemIdможете да получите ID на избрания елемент от менюто. След като идентифицирате елемента от менюто, можете да напишете код за обработка на събитието за избор на меню:

Public boolean onOptionsItemSelected(MenuItem item) ( switch (item.getItemId()) case IDM_OPEN: return true; case IDM_SAVE: return true; return false; )

Бързи клавиши

Можете също да зададете бързи клавиши за бърз достъп с помощта на знаци от клавиатурата, като използвате няколко метода:

  • setAlphabeticShortcut(char) - добавя символ
  • setNumericShortcut(int) - добавя число
  • setShortcut(char, int) – Добавя комбинация от знак и число

Например, ако зададете бързия клавиш setAlphabeticShortcut("q");, тогава, когато отворите менюто (или докато държите натиснат клавиша MENU), натискането на клавиша Qизбира този елемент от менюто. Това горещ клавиш(или клавишна комбинация) ще се покаже като подсказка под името на елемента от менюто. По-новите клавиатури имат отделен клавиш ctrl, който работи по същия начин като на обикновените клавиатури.

Бързите клавиши могат да бъдат създадени и чрез XML: android:alphabeticShortcut="c".

Можете да обработвате щраквания чрез метода на активността onKeyShortcut():

@Override public boolean onKeyShortcut(int keyCode, KeyEvent event) ( switch (keyCode) ( case KeyEvent.KEYCODE_R: Toast.makeText(this, "Reply", Toast.LENGTH_SHORT).show(); return true; default: return super. onKeyShortcut(keyCode, събитие); ) )

Създаване на подменю

Подменю може да се добави към всяко меню, с изключение на друго подменю. Подменюто се създава в метода за обратно извикване onCreateOptionsMenu()използвайки метода addSubMenu()който връща обект подменю. Възразявам подменюможете да добавите допълнителни елементи към това меню, като използвате метода добави (). Например:

Публичен статичен финал int IDM_HELP = 101; публичен статичен финал int IDM_NEW = 201; публичен статичен финал int IDM_OPEN = 202; публичен статичен финал int IDM_SAVE = 203; публичен статичен финал int IDM_CUT = 301; публичен статичен финал int IDM_COPY = 302; публичен статичен финал int IDM_PASTE = 303; @Override public boolean onCreateOptionsMenu(Menu menu) ( 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, "Изрязване"); subMenuEdit.add(Menu.NONE, IDM_COPY, Menu.NONE, "Копиране"); subMenuEdit.add(Menu.NONE, IDM_PASTE, Menu.NONE, "Поставяне"); меню. add(Menu.NONE, IDM_HELP, Menu.NONE, "Помощ"); return super.onCreateOptionsMenu(menu); ) @Override public boolean onOptionsItemSelected(MenuItem item) ( CharSequence съобщение; switch (item.getItemId()) ( case IDM_NEW : message = "Избран нов елемент"; break; case IDM_OPEN: message = "Отворете избрания елемент"; break; case IDM_SAVE: message = "Запазете избрания елемент"; break; case IDM_CUT: message = "Изрежете избрания елемент"; break; case IDM_COPY:message= „Копиране на избрания елемент“; прекъсване; case IDM_PASTE: съобщение = "Поставяне на избрано"; прекъсване; case IDM_HELP: съобщение = "Избран елемент от помощ"; прекъсване; по подразбиране: връща невярно; ) // показване на известие за избрания елемент от менюто Toast toast = Toast.makeText(this, message, Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); връща вярно; )

Сега, когато изберете елемент от менюто, ще се появи друг прозорец с подменю. Опитайте сами.

Добавяне на квадратчета за отметка и радио бутони

Можете да добавяте квадратчета за отметка или радио бутони към елементите на менюто. За да добавите квадратче за отметка или радио бутон за отделен елемент от менюто, трябва да използвате метода setCheckable():

Елемент от менюто = menu.add(0, IDM_FORMAT_BOLD, 0, "Удебелен"); item.setCheckable(true);

Ако има нужда да добавите няколко елемента от менюто с квадратчета за отметка или радио бутони, тогава можете да ги комбинирате в групи от менюта, като създадете отделен идентификатор. Елементът от менюто се добавя към групата чрез метода добави (), предавайки му идентификатора на групата меню като първи параметър. Да приемем, че сме декларирали идентификатори за групата от менюта Цвят и елементи от менюто, за да зададем цвета:

Публичен статичен финал int IDM_COLOR_GROUP = 400; публичен статичен финал int IDM_COLOR_RED = 401; публичен статичен финал int IDM_COLOR_GREEN = 402; публичен статичен финал int IDM_COLOR_BLUE = 403;

Сега, за да създадете група менюта с квадратчета за отметка, трябва да присвоите групов идентификатор на всеки елемент от менюто и да извикате метода setGroupCheckable()за цялата група (в този случай не е необходимо да извиквате метода setCheckable()за всеки елемент от менюто):

Подменю subMenuColor = menu.addSubMenu("Цвят"); 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, true, false);

При метода setGroupCheckable()три варианта:

  • първият параметър е ID на групата от менюта;
  • вторият параметър е верен, ако в групата са разрешени радио бутони или квадратчета за отметка;
  • трети параметър - задава единичен (true) или многократен (false) избор на елементи от менюто. Тази настройка всъщност определя външния вид на менюто - то ще бъде меню с радио бутони или квадратчета за отметка.

    За да контролирате състоянието на квадратчетата за отметка и радио бутоните в манипулатора на събития за избор на елемент от менюто, напишете следното:

    @Override public boolean onOptionsItemSelected(MenuItem item) ( CharSequence message; switch (item.getItemId()) ( ... case IDM_COLOR_RED: // инвертиране на състоянието на квадратчето item.setChecked(!item.isChecked()); message = "Червен цвят "; прекъсване; по подразбиране: връща невярно; )

    Стартирайте проекта, извикайте менюто и изберете елемента от менюто Цвят. Ще имате подменю с три елемента (червено, зелено, синьо) под формата на флагове. Състоянието на отметките и превключвателите се обработва в програмния код и се запазва при повторно извикване на менюто.

    Можете незабавно да присвоите намерение на избрания елемент от менюто чрез метода setIntent(), който ще се задейства, когато се щракне върху този елемент, ако това събитие не е уловено от манипулаторите onMenuItemClickListener (отхвърлено) или onOptionsItemSelected. Веднъж задействано, намерението се предава на метода startActivity.

    MenuItem.setIntent(ново намерение(това, MyOtherActivity.class));

    Програмно отваряне или затваряне на меню

    Ако по някаква причина трябва програмно да отворите менюто (например за демонстрационни цели), използвайте метода openOptionsMenu():

    OpenOptionsMenu();

    За програмно затваряне на менюто използвайте метода closeOptionsMenu(), но имам повторно извикване на метода openOptionsMenu()също затваря менюто.

    Програмно премахване на елемент от менюто

    Да кажем, че сме дефинирали елемент от менюто в xml файл:

    За да премахнем очевидно ненужен елемент от менюто от нашата програма за котки, трябва да осъществим достъп до елемента от менюто чрез метода findItem()и го направете невидим. Препратка към обекта Menu трябва да бъде предадена на метода onCreateOptionsMenuтака че програмата да научи за промяната в състава на менюто.

    // класова променлива Menu menu; @Override public boolean onCreateOptionsMenu(Menu menu) ( super.onCreateOptionsMenu(menu); // предава препратка към нашия обект this.menu = menu; getMenuInflater().inflate(R.menu.test, menu); return true; ) / / щракване върху бутона public void onClick(View v) ( if (menu != null) ( // намиране на желания елемент MenuItem item_dog = menu.findItem(R.id.action_dog); // прави го невидим item_dog.setVisible(false) );)))

    Но това решениеима недостатък, ако завъртим екрана, дейността ще бъде пресъздадена и дистанционното меню ще се появи отново. Как да се отървем от грозното куче?

    Трябва да запомним състоянието на елемента от менюто и да го съхраним в обект от тип Bundle в метода onSaveInstanceState, и в метода onCreate()извличане на запазено състояние и преминаване към метод onPrepareOptionsMenu, който се извиква преди менюто да се покаже на екрана:

    Пакет en.alexanderklimov.test; импортиране на android.app.Activity; импортиране на android.os.Bundle; импортиране на android.view.Menu; импортиране на android.view.MenuItem; импортиране на android.view.View; публичен клас TestActivity разширява Activity ( Menu menu; Boolean savedMenuDogIsVisible; final static String KEY_MENU_DOG = "KEY_MENU_DOG"; @Override public void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); // извличане данни за видимост на елемент от менюто if (savedInstanceState != null) ( savedMenuDogIsVisible = savedInstanceState.getBoolean(KEY_MENU_DOG, true); ) ) @Override public boolean onCreateOptionsMenu(Menu menu) ( super.onCreateOptionsMenu(menu); this.menu = menu; getMenuInflater ( ).inflate(R.menu.test, menu); return true; ) public void onClick(View v) ( if (menu != null) ( MenuItem item_dog = menu.findItem(R.id.action_dog); // скрий елементът от менюто item_dog.setVisible(false); ) ) @Override protected void onSaveInstanceState(Bundle outState) ( // TODO Автоматично генериран метод stub super.onSaveInstanceState(outState); if (menu != null) ( MenuItem item_dog = menu. findItem(R.id.action_dog); // запазва текущото състояние на елемента от менюто - true или false outState putBoolean(KEY_MENU_DOG, item_dog.isVisible()); ) ) @Override public boolean onPrepareOptionsMenu(Menu menu) ( if (savedMenuDogIsVisible != null) ( MenuItem item_dog = menu.findItem(R.id.action_dog); // преди показване на желаното състояние на менюто item_dog.setVisible(savedMenuDogIsVisible) ; ) върне super.onPrepareOptionsMenu(меню); ) )

    Откриване на наличието на бутон Меню

    По-старите устройства използваха истински бутон за меню. В новите версии андроид менюпремахнат в ActionBar и присъствието му като отделен бутон стана незадължително. Но много производители все още произвеждат телефони с бутон за меню. За да се определи дали има такъв бутон, се добавя Android 14 нов метод, което ще определи наличието на този бутон.

    If(Build.VERSION.SDK_INT<= 10 || (Build.VERSION.SDK_INT >= 14 && ViewConfiguration.get(this) .hasPermanentMenuKey())) ( // ключът на менюто присъства Toast.makeText(this, "Бутонът на менюто е", Toast.LENGTH_LONG).show(); ) else ( // Няма меню ключ Toast.makeText(this, "Без бутон за меню", 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, menu); )

    FragmentManagerотговорен за обаждането onCreateOptionsMenu()когато дейността получи обратно извикване onCreateOptionsMenu()от системата. Трябва изрично да кажете на управителя FragmentManagerче фрагментът трябва да бъде извикан onCreateOptionsMenu(). За това методът се извиква setHasOptionsMenu():

    // В кода на фрагмента @Override public void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); setHasOptionsMenu(true); getActivity().setTitle(R.string.cat); ... )

Преди Honeycomb (Android 3.0) всички устройства с Android имаха бутон „меню“ под екрана. Разработчиците можеха да го използват както намерят за добре и интерфейсите на много приложения бяха изградени около този бутон. Ориентираният към таблета Honeycomb направи крачка встрани от механичните (и сензорните) бутони и в това отношение в трет. версии на androidсе появи класът ActionBar, който направи възможно даването на потребителя бърз достъпкъм настройките на приложението чрез специален панел, наречен лента за действие. Според Google DevelopersЛентата за действие е бъдещето и програмистите трябва да спрат да използват бутона "меню". В момента пазарът е доминиран от смартфони с механични или сензорен бутонпод екрана, но с появата на Ice Cream Sandwich ситуацията може драстично да се промени. За вас, като разработчик, е важно да се подготвите предварително за появата на такива устройства и да използвате концепцията на Action bar днес.

На пръв поглед може да изглежда, че използването на лентата за действие ще създаде проблеми при разработването на програми за Android 2.x, в които тази лента все още не е внедрена. Тук обаче няма проблем. Никой не ви забранява да продължите да използвате бутона "меню" на тези устройства, където той присъства, добавянето на лента за действие ще изисква да напишете само няколко реда код.

Ако се опитам да съкратя тази статия в едно изречение, то ще бъде: " Задайте targetSdkVersion на 14 и маркирайте showAsAction="ifRoom" на елементите от менюто, които трябва да бъдат изобразени в лентата за действие".

Окончателното отхвърляне на менюто с настройки в Android

Не е достатъчно просто да спрете да използвате бутона „меню“, трябва напълно да изхвърлите концепцията от главата си. Не създавайте менюта, създайте всички необходими бутони директно в дейностите. Ако някои действия не се побират в панела, поставете ги в допълнително падащо меню (препълване на действие). Горната снимка показва лента за действие с бутон за търсене и допълнително меню от дясната страна на лентата.

Ако вашето приложение е създадено за Стара версия android (който традиционно използва меню), тогава, когато се стартира на таблет с Android 3, в долната част на екрана ще се покаже панел, който емулира трите бутона, които съществуват на телефоните от втория клон.

Терминологията е доста объркваща, но падащото меню (препълване на действие) предлага напълно различна концепция за използване от обикновеното меню с настройки. Вместо да мислите за менюто като за хранилище за всички настройки на приложението, вие създавате панел, където поставяте основните настройки. Всичко второстепенно се изважда в падащото меню, което се извиква, когато щракнете върху бутона с три точки (Action overflow button) от дясната страна на панела.

бутон за преливане на действие

Ако сте стартирали приложения, написани за Android 2.3 и по-стари версии на устройства без бутони под екрана (например на таблет с Honeycomb или на Galaxy Nexus), може да сте забелязали, че бутон за преливане на действие се появява до изображението на три бутона на панела в долната част (три точки една върху друга). Това е компромис, но не много добър. В приложения, които изобщо не използват менюто с настройки, този бутон не прави нищо, което дразни потребителите. Следователно, много добро решение би било да следвате версия на androidи ако вашата програма работи под Android 3.0+, премахнете този бутон от лентата за навигация и използвайте лентата за действие. Този подход ви позволява да поддържате програмата съвместима със старите устройства и да я направите по-привлекателна за новите.

Ако вашата програма работи на устройства без бутони, системата решава дали да добави препълване на действие към лентата за навигация в зависимост от стойността на полето в манифеста. Логиката е следната

  • Ако зададете minSdkVersion или targetSdkVersion на стойност, по-голяма от 11, тогава системата не добавя този бутон.
  • От друга страна, системата създава този бутон, когато стартирате приложението на Android 3.0 и по-нова версия.
  • Единственото изключение е, когато зададете minSdkVersion на 10 или по-ниска; targetSdkVersion на 11, 12 или 13 и няма да използва ActionBar, системата ще добави този бутон на телефони (не таблети) под Android управление 4.0 и по-нови. Това изключение се основава на следната идея: ако разработвате приложение за телефони от втория клон и за таблети от третия, тогава предполагате, че телефоните трябва да имат бутон за меню, но таблетите не.

По този начин, ако искате да деактивирате действието за преливане на бутон в лентата за навигация, трябва да зададете targetSdkVersion на 14 (minSdkVersion може да бъде настроен на повече от ниска стойносттака че програмата да може да работи на по-стари устройства).

Преход към концепцията на лентата с действия

Ако имате дейности, които използват менюто с опции (създадено с onCreateOptionsMenu()), тогава чрез премахване на бутона от лентата за навигация (чрез задаване на targetSdkVersion=14) трябва да предоставите на потребителя алтернативно средство за достъп до опциите. За щастие не е нужно да вършите много работа, защото системата автоматично създава лента за действие.

Добавете showAsAction="ifRoom" към вашите тагове елементите, които искате да поставите в лентата с действия. Ако не сте сигурни кой елемент да включите в лента за действие, вижте ръководството за лента за действие на Android Design.

За да направите възприемането на вашата програма по-цялостно, препоръчваме ви да използвате икони от Android UX екип. Архив .

Как да премахнете лентата с действия от приложението за Android

Ако не се нуждаете от лентата с действия, можете да я премахнете от всяка дейност или дори от приложението. Това може да е от значение за игри и програми, които не използват менюто с настройки. Можете да премахнете лентата с действия, като използвате темата Theme.Holo.NoActionBar или Theme.DeviceDefault.NoActionBar.

Ако искате да използвате тези схеми, но запазете обратно съвместим, можете да използвате системата за управление на ресурсите, за да зададете различни теми за различни версииплатформи. Тази тема е разгледана по-подробно тук. Ще трябва да създадете своя собствена тема, която ще наследи от теми различни платформив зависимост от текущата версия.

Например, можете да декларирате тема за вашето приложение

(или за конкретна дейност в етикет ).

За устройства с Android 2 включете следната тема в res/values/themes.xml.



За Honeycomb включете следната тема в res/values-v11/themes.xml.



При стартиране, в зависимост от версията на API, системата ще избере подходящата тема.

Заключение

Нека обобщим основните идеи и точки на статията:

  • На нов AndroidУстройствата може да нямат бутон "меню", така че когато разработвате програми, е по-добре изобщо да не го използвате.
  • Задайте targetSdkVersion = 14 и тествайте приложението си на Android 4.0.
  • Добавете маркера showAsAction="ifRoom" към елемент от менюто, ако искате той автоматично да отиде в лентата с действия.
  • Ако вашето приложение не използва ActionBar, можете да го премахнете с помощта на темите Theme.Holo.NoActionBar и Theme.DeviceDefault.NoActionBar.

Android поддържа няколко вида менюта. Първо - има отделен бутон на телефона Меню(при по-стари телефони), натискането на което извежда менюто. В новите устройства беше премахнат отделен бутон, който беше заменен с икона на менюто триточки във вертикална ориентация. Вторият тип е контекстно меню, което се появява, когато натиснете и задържите пръста си върху екрана правилно място(Можете също да натиснете и задържите централния бутон на телефона си). Контекстно менюот своя страна може да има подменю. Днес ще се запознаем с първия вид меню. Тази статия ще разгледа работата с менюто на нови устройства с Android 4.0 и по-нова версия.

В шаблон празна дейностняма меню, така че ще го създадем сами. Това ще ви помогне да разберете как работи и да получите обща представа за проекта. Не е необходимо да запомните имената на класовете, методите и кода за обработка на избора на елементи от менюто. В други шаблони менюто ще бъде вградено и можете да го използвате веднага.

Създавайте нов проектвъз основа празна дейности го стартирайте. Все още няма меню.

Създаване на множество низови ресурси във файл res/values/strings.xml, който ще отговаря за елементите от менюто:

Настройки котка котка Кити

Сега създайте нова папка менюв папка рез рез, | Нов | Справочник). След това създайте файл в създадената папка menu_main.xml- името показва, че менюто принадлежи към основната дейност Основна дейност(щракнете с десния бутон върху папката меню | Нов | Файл с ресурси на менюто). Ако създадете приложение с множество екрани, тогава всяка дейност ще има отделно меню със собствени настройки. Докато отваряте файла menu_main.xmlи добавете нашия код към получения шаблон:

Да отворим файла Основна дейност. В момента има само един метод. onCreate(). Нека добавим нов метод onCreateOptionsMenu(). Точно този методотговаря за външния вид на менюто в дейността. Изберете от менюто на студиото Код| и в следващия прозорец започнете да въвеждате името на метода с първите букви. Може да се въведе първо главни букви, т.е. ocom( он ° Спроцент Онастроики М enu), за да намерите бързо желания низ. Натискаме бутона Добреи получаваме детайла.

@Override public boolean onCreateOptionsMenu(Menu menu) ( return super.onCreateOptionsMenu(menu); )

Добавяме метод към подготовката, който взема данни от ресурсите на менюто и ги преобразува в елементи от менюто на екрана.

@Override public boolean onCreateOptionsMenu(Menu menu) ( getMenuInflater().inflate(R.menu.menu_main, menu); return true; )

В метод надувам ()вие сочите към ресурс от менюто ( R.menu.menu_main) и клас обект Меню.

На английски "inflate" се превежда като надувам, т.е. по дизайн разработчици на android, ние един вид раздуваме обект с данни, например меню. Но всъщност думата „надувам“ идва от фразата апартамент- до апартамента. Има стара традиция да се пусне първата котка в апартамента, която изследва всички кътчета и кътчета на къщата и декларира съгласието си да живее в нея. Така че пускаме данните от XML файла в обекта MenuInflater.

Стартирайте проекта. Сега от дясната страна на заглавката ще видите икона от три подредени точки вертикална линия. Кликнете върху иконата, за да видите елемента от менюто Настройки.

Както не е трудно да се досетите, елементът вещотговаря за отделен елемент от менюто. Нека добавим още три елемента по същия начин, като променим само идентификатора и текста за менюто:

Стартирайте проекта и опитайте да изведете менюто отново. Ще видите три нови елемента.

Настроики документ за самоличности заглавиеняма нужда от обяснение. Параметър поръчка ВКатегорияви позволява да зададете свой собствен ред на показване на елементи от менюто. Да предположим, че сте създали пет елемента от менюто, но все още не сте решили реда, в който се показват на екрана. За да не премествате непрекъснато цели блокове код за елементи от менюто правилен ред, можете да използвате тази опция.

И накрая, важен атрибут app:showAsActionопределя поведението на менюто в ActionBar. Значение никогаозначава, че елементът от менюто не трябва да се показва в заглавката, а само в изскачащото меню, т.е. бъде зад трите точки. Ако зададете стойността винаги, след това точка Настройкинезабавно ще се появи в заглавката на вашето приложение. Също налични стойности ifRooms, с тексти collapseActionView. Опитайте сами. Например, ifRoomПоказва елемент от менюто, ако мястото позволява. Ако има много точки, те само ще пречат. По правило тази опция показва много кратка дума или икона за чести операции, за да се избегнат ненужни кликвания върху три точки.

Обърнете внимание на атрибута app:showAsAction, което принадлежи на пространството от имена xmlns:app="http://schemas.android.com/apk/res-auto". Имаше време, когато такова пространство от имена не съществуваше и проектите използваха атрибута android:showAsActionот стандартното пространство на имената. Ако студиото се закълне в грешката, тогава редактирайте кода.

Докато не се изпълнят елементите от менюто полезна работа. Всяко кликване върху елемента просто затваря менюто без видими последствия. Все още не сме написали кода за обработка на кликвания.

Избор на елементи от менюто

Научихме как да съставим меню. Но засега е безполезно, тъй като елементите от менюто не реагират по никакъв начин на нашите кликвания. Друг метод се използва за обработка на щраквания върху менюто. onOptionsItemSelected(). Нека добавим метод по същия начин, както в предишния пример. Да вземем подготовката.

@Override public boolean onOptionsItemSelected(MenuItem item) ( return super.onOptionsItemSelected(item); )

Параметър вещотговорен за елемента от менюто. Трябва да получите идентификатор на меню чрез метод getItemId()и въведете код за него. Тъй като менюто обикновено се състои от няколко елемента, е удобно да се използват конструкциите ако/иначеили превключвател. За показване на информация използваме текстов етикет. Добавете компонент към екрана за активност текстов изглед. Можете да използвате съществуващите текстов изгледс етикет „Здравей свят!“, просто му дайте ID.

android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!"/>

Нека добавим кода към празното поле за избрания елемент от менюто:

@Override public boolean onOptionsItemSelected(MenuItem item) ( // Получаване на идентификатора на избрания елемент от менюто int id = item.getItemId(); TextView infoTextView = (TextView) findViewById(R.id.textView); // Операции за избрания превключвател на елемент от менюто ( id) ( case R.id.action_cat1: infoTextView.setText("Вие избрахте котка!"); return true; case R.id.action_cat2: infoTextView.setText("Вие избрахте котка!"); return true; case R. id.action_cat3: infoTextView.setText("Избрахте коте!"); return true; default: return super.onOptionsItemSelected(item); ) )

Стартирайте приложението, извикайте менюто и изберете произволен елемент от менюто. В текстовото поле трябва да се появи съобщение.

Съществува алтернативен начинчрез XML, подобно на обработката на щраквания върху бутони (от Android 3.0 насам). Можете да добавите атрибут android:onclickв ресурсите на менюто и не е необходимо да използвате извикване на метод onOptionsItemSelected(). С помощ android:onclickможете да посочите желания метод, когато избирате елемент от менюто. Добавете този атрибут към артикула Настройки

Сега в кода на дейността ще напишем следното:

// атрибутът на елемент от менюто Настройки е зададен на android:onClick="onSettingsMenuClick" public void onSettingsMenuClick(MenuItem item) ( TextView infoTextView = (TextView) findViewById(R.id.textView); infoTextView.setText("Избрали сте Настройки, по-добре бих избрал котка"); )

Превключватели

Външният вид на елементите от менюто може да се промени на изглед с радио бутони. За да направите това, добавете елемент групас атрибут android:checkableBehavior="единичен":

Не виждам много смисъл от този режим. И няма да го разгледаме.

Режим на проектиране

Android Studio 2.2 добави режим на изграждане на графично меню, което прилича на лента с инструменти за добавяне на нови компоненти към екрана. Лентата с менюта се състои от четири елемента: Елемент от менюто, Търсене на елемент, Меню, група.

Принципът е същият, изберете желания елемент и го плъзнете на екрана в областта на менюто. Ако сте се научили ръчно да създавате меню, тогава насамняма да ви създаде проблеми. С него можете бързо да очертаете структурата на менюто и след това да я промените ръчно.