MojAndroid

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:

14.4.2012

Pravidlá diskusie

Portál MojAndroid.sk si vyhradzuje právo zmazať neslušné, rasistické a vulgárne príspevky, ako aj osobné útoky na redakciu, či diskutérov v komentároch pod článkom bez ďalšieho upozornenia. V prípade uverejňovania odkazov na externé stránky, je komentár automaticky preposlaný do redakcie na schválenie.

+