Въведение в менютата на Android

В Android има три вида менюта: изскачащо, контекстно и опции.

Всеки от тях има специфичен случай на употреба и код, който се съчетава с него. За да научите как да ги използвате, прочетете нататък.

Всяко меню трябва да има свързан с него XML файл, който определя оформлението му. Това са маркерите, свързани с опцията от менюто:

- Това е елементът на контейнера за вашето меню (подобно на LinearLayout)

- Това означава елемент и е вложен вътре в маркера на менюто. Имайте предвид, че елемент елемент може да съдържа елемент, който представлява подменю

- Това се използва за означаване на определено свойство или функция за няколко елемента от менюто (IE състояние / видимост)

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

  • id - Това е уникален идентификатор за елемента в менюто. Можете да използвате това, за да видите точно кой елемент е щракнал потребителят
  • икона - Ако искате да покажете икона, свързана с този елемент от менюто
  • заглавие - Текст, който ще се покаже в менюто за този елемент
  • showAsAction - Този атрибут трябва да се използва само когато се използва меню в дейност, която използва лента на приложението (или както се нарича също лентата за действие). Той контролира кога и как този елемент трябва да се показва като действие в лентата на приложението. Има пет стойности: винаги, никога, ifRoom, withText и kolapsActionView
android:showAsAction="always|never|ifRoom|withText|collapseActionView" 

Ще разгледам значението на всяка от тези стойности в следващия раздел.

Освен това трябва да добавите съответния метод от менюто onCreate към вашата дейност.

//Options Menu @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.options_menu, menu); return super.onCreateOptionsMenu(menu); } //Context Menu @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.context, menu); }

Меню с опции

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

Използвайки оформлението на менюто отгоре, получаваме следното меню с опции:

Както беше обещано, нека разгледаме стойностите, които могат да бъдат дадени за атрибута showAsAction:

  • винаги - винаги ще се показва в лентата за действие
  • никога - никога няма да се покаже и следователно ще бъде достъпно чрез менюто за препълване
  • ifRoom - само ако има достатъчно място в лентата за действие, то ще бъде показано. Имайте предвид, че според документацията има ограничение за броя икони, които можете да имате в лентата за действие.
  • withText-ще включва заглавието на елемента в лентата за действие
  • collapActionView - ако този елемент има изглед за действие, свързан с него, той ще стане сгъваем (от API 14 и по-горе)

Ако продължим напред и сменим последния елемент от менюто си на showAsAction = "никога" , получаваме следното:

Изображение за публикация

Контекстуално меню

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

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

Контекстното меню може да се появи по два начина:

  1. Плаващо меню
  2. Лента за действие в горната част на вашето приложение

Ще покажем само как да използваме първата опция, но можете да прочетете повече за втората опция тук.

Използване на следния XML:

И добавяне на следния код към нашата основна дейност:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TYPE_OF_LAYOUT layout = (TYPE_OF_LAYOUT)findViewById(R.id.main_layout); registerForContextMenu(layout); }

Ще получим следното:

Изскачащо меню

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

Ще използваме същото XML оформление на менюто, както и преди, но ще трябва да добавим следния код към нашата дейност:

void showPopupMenu(View view) { PopupMenu popup = new PopupMenu(this, view); MenuInflater inflater = popup.getMenuInflater(); inflater.inflate(R.menu.actions, popup.getMenu()); popup.show(); }

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

Икони в изскачащи менюта

Сега знам за какво вероятно сте тук: искате да знаете как можете да добавяте икони към менютата .

Въпреки че ще покажа пример за това, разумно е да разберем, че това е функция, която не е активирана за изскачащи менюта и може да причини неочаквано поведение. Можете да постигнете това, като използвате отражение, за да включите флаг, наречен setForceShowIcon .

//popup is an instance of PopupMenu try { Field[] fields = popup.getClass().getDeclaredFields(); for (Field field : fields) { if ("mPopup".equals(field.getName())) { field.setAccessible(true); Object menuPopupHelper = field.get(popup); Class classPopupHelper = Class.forName(menuPopupHelper .getClass().getName()); Method setForceIcons = classPopupHelper.getMethod( "setForceShowIcon", boolean.class); setForceIcons.invoke(menuPopupHelper, true); break; } } } catch (Throwable e) { e.printStackTrace(); }

Току-що надрасках повърхността с менютата на Android, но се надяваме, че е достатъчно, за да ви вдъхнови да се задълбочите.