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:






