Menu, resp. ponuka, je bežne používaný komponent v mnohých aplikáciách. Poskytuje známe a konzistentné používateľské prostredie poskytujúce používateľovi dodatočné funkcie a akcie. Všetky typy ponúk sa dajú jednoducho zadefinovať XML súbormi, no ich štýlovanie je tiež značne obmedzené.
Na rozdiel od štandardného postupu tvorby menu v aplikácií som v tomto návode zvolil pridávanie nových položiek do ponuky prostredníctvom vkladania vlastných objektov do zoznamu položiek vlastného menu.
Opäť ide o implementáciu novej triedy poskytujúcej plnohodnotú funkcionalitu menu, a navyše umožňujúcej použiť ľubovoľné rozloženie vnorených prvkov. Ide o komplexnú triedu zohľadňujúcu rôzne vonkajšie faktory, podmienky zobrazenia a konfiguráciu, no v skratke ju možno charakterizovať pár vetami.
V rámci novej triedy je definovaný enumeračný typ identifikujúci položku v ponuke, ktorý sa dá jednoducho a kedykoľvek rozšíriť:
public enum MenuItemId { ABOUT, HELP }
Privátne premenné triedy perLinePortrait
a perLineLandscape
určujú počet položiek v zozname na jeden riadok vzhľadom na aktuálne natočenie / orientáciu zariadenia. Trieda má vnorené rozhranie, ktoré musí byť niekde implentované, aby malo zobrazenie ponuky vôbec zmysel:
public interface OnMenuItemSelectedListener { public void MenuItemSelectedEvent(MenuItem selection); }
V deklarácii metódy rozhrania už vidieť, že položky ponuky budú objekty novej triedy MenuItem, ktorá je charakteristická svojim identifikátorom, textovým opisom a môže byť aj obrázkom.
Pridávanie nových položiek môže vyzerať nasledovne:
menu.addMenuItem( new MenuItem(MenuItemId.ABOUT, getString(R.string.about), R.drawable.icon_menu) );
A implementácia metódy rozhrania takto:
@Override public void MenuItemSelectedEvent(MenuItem selection) { if (selection.getId().equals(MenuItemId.ABOUT)) { startActivity(new Intent(this, AboutActivity.class)); } }
Samotnú ponuku, je ale potrebné najprv zobraziť. Dosiahnuť sa to dá zachytením udalosti stlačenia hárdverového tlačidla pre zobrazenie ponuky:
public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU) { if (menu != null) menu.show(); return true; } return super.onKeyDown(keyCode, event); }
Trieda Menu
má vlastnú metódu buildTable(int itemCount)
, ktorá ma na starosti vykresliť ponuku na základe počtu vnorených objektov – tlačidiel. Dokopy má vyše 70 riadkov, pozrieť si ju môžeťe opäť v zdrojových kódoch TutorialCustomMenu.zip.
A aby som nezabudol, výsledný efekt: