prvý mesiac tréningu. Poďme sa bližšie pozrieť na menu. Do úvahy sa budú brať staré zariadenia so systémom Android 2.3 aj nové telefóny so systémom Android 4.0.

Ponuka možností

Za jedálny lístok zodpovedá trieda android.view.Menu. Každá aktivita je spojená s jedným objektom ponuky. Samotné menu obsahuje položky menu (class android.view.Položka ponuky) a podmenu (trieda android.view.SubMenu).

Keď stlačíte tlačidlo Ponuka na starších telefónoch sa k aktivite pripája súbor položiek ponuky. Ponuka môže obsahovať ikony. Takéto menu môže obsahovať šesť položiek (spravidla). Ak je položiek viac ako šesť, použije sa rozšírené menu - v tomto prípade sa namiesto šiestej položky zobrazí položka možnosti(viac). Po stlačení tejto položky sa zobrazí rozšírená ponuka so zoznamom položiek, ktoré sa nezmestili do hlavnej časti ponuky výberu možností.

Pri prvom otvorení ponuky Android zavolá metódu onCreateOptionsMenu(), odovzdávanie objektu ako parametra Ponuka. Ponuky môžu byť vytvorené ako zdroje v súbore XML alebo môžete použiť pridať ().

V štandardnom projekte je pri výbere bežnej šablóny už prázdne miesto pre jednobodové menu nastavenie a volanie metódy pre menu (už o tom viete).

Vytvorenie menu pomocou zdrojov

Zvážte prácu s ponukou prostredníctvom zdrojov. Na vytvorenie menu sa používajú zdroje, ktoré musia byť uložené v súbore XML. Samotný súbor musí byť v priečinku res/menu/ váš projekt. Menu pozostáva z nasledujúce položky:

Určuje ponuku, ktorá bude obsahovať položky ponuky. Prvok musí byť koreňovým prvkom v štruktúre XML súboru a môže obsahovať jeden alebo viac prvkov a Vytvára položky ponuky priamo. Tento prvok môže mať vnorený prvok na vytvorenie podponuky Voliteľne môžete použiť aj kontajner neviditeľných prvkov . To vám umožní dosiahnuť určité efekty

Predpokladajme, že sa rozhodneme použiť menu na nejakú hru. Poďme tvoriť nový súbor game_menu.xml:

Vytvorili sme menu s dvoma položkami. Každá položka obsahuje nasledujúce atribúty:

Android:id Identifikátor položky ponuky, podľa ktorého môže aplikácia rozpoznať, keď používateľ vyberie položku ponuky android:title Text, ktorý sa zobrazí v ponuke

Pre prvok existujú ďalšie atribúty položka, napríklad android:icon="@drawable/home" zobrazí aj ikonu položky ponuky a android:enabled="false" umožňuje zneprístupniť položku ponuky.

Atribút android:titleCondensed používa sa, keď je bežný názov príliš široký na to, aby sa „vošiel“ do vybranej položky ponuky.

Atribút android:orderInCategory definuje poradie, v ktorom sa položky ponuky MenuItems zobrazujú.

Pri vytváraní menu sme poukázali na reťazcové zdroje @string/nová_hra a @string/help. Do súboru je potrebné pridať nové riadky strings.xml:

Nová hra Odkaz

Teraz musíme vykonať zmeny v triede aktivity, v ktorej sa zobrazí ponuka. Program by mal previesť zdroj ponuky, ktorý sme vytvorili, na objekt programu. Na tento účel existuje špeciálna metóda. MenuInflater.inflate(), ktorá sa volá špeciálnou metódou zavolaj späť onCreateOptionsMenu(). Táto metóda je určená na zobrazenie ponuky po stlačení tlačidla. PONUKA na zariadení:

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

Po vložení kódu vás vývojové prostredie požiada o import chýbajúcich menných priestorov.

Importovať android.view.Menu; importovať android.view.MenuInflater;

Metóda onCreateOptionsMenu() metóda spustí prvé zobrazenie ponuky na obrazovke a ako parameter berie objekt ponuky (pre staršie zariadenia). Môžete si uložiť odkaz na menu a použiť ho kdekoľvek vo svojom kóde, pokiaľ ide o metódu onCreateOptionsMenu() nebude znovu volaný. Vždy by ste mali používať implementáciu rodičovskej triedy tohto obslužného programu, pretože v prípade potreby automaticky zahŕňa ďalšie systémové položky v ponuke. V nových zariadeniach sa metóda volá pri vytváraní aktivity. Metóda musí vrátiť hodnotu pravda aby bola ponuka viditeľná na obrazovke.

Po spustení programu stlačte tlačidlo PONUKA na emulátore, aby ste videli vytvorenú ponuku.

Metóda getMenuInflater() vráti inštanciu triedy nafukovač menu, ktorý používame na čítanie údajov menu z XML.

Ako vidíte, ponuka sa zobrazí v spodnej časti obrazovky. Súčasne je možné zobraziť celkovo šesť položiek ponuky. Ak je bodov viac, zobrazí sa päť bodov plus šiesty bod Viac, čo vám umožní zobraziť zvyšok položiek. Poďme otestovať a pridať nové položky ponuky.

Najprv pridajme šesť bodov.

Pridajme do menu ešte jednu položku, aby ich bolo sedem.

Výber položiek ponuky

Naučili sme sa vytvárať menu. Ale zatiaľ je to zbytočné, keďže položky menu nijako nereagujú na naše kliknutia. Metóda sa používa na spracovanie kliknutí na položky ponuky. onOptionsItemSelected(). Metóda rozpoznáva položku vybratú používateľom prostredníctvom MenuItem. Vybratú položku teraz môžeme určiť volaním getItemId(), ktorý vráti ID položky ponuky. Ďalej cez operátora prepínač zostáva na nás definovať potrebné príkazy:

@Override public boolean onOptionsItemSelected(položka MenuItem) ( // Operácie pre prepínač vybratej položky ponuky (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("Vybraná nová hra"); ) public void showHelp() ( edtext.setText("Vybratá pomoc" ) ;)

Spustite aplikáciu, vyvolajte ponuku a vyberte prvú alebo druhú položku ponuky. V textovom poli by sa mala zobraziť správa.

V uvedenom príklade getItemId() požiada o ID pre vybratú položku ponuky a začne porovnávať prostredníctvom príkazu na výber prepínača s ID, ktoré sme nastavili v zdrojoch XML. Keď sa nájde požadovaný identifikátor, vykoná sa handler pre danú položku menu. Ak program nič nenájde, príkaz sa vykoná predvolená, ktorá vráti supertriedu.

V systéme Android 3.0 môžete pridať atribút android:onclick v zdrojoch ponuky a už ich nemusíte používať onOptionsItemSelected(). S pomocou android:onclick pri výbere položky ponuky môžete určiť požadovanú metódu.

// atribút položky ponuky nastavený na android:onClick="onMenuClick" public void onMenuClick(položka MenuItem)( edtext.setText("Nakŕmiť mačku vybratú"); )

Tvorba menu programovo

Zvážte tvorba softvéru menu pre úplnosť. Budeme musieť definovať niekoľko konštánt pre položky ponuky:

// identifikátory pre položky menu private static final int IDM_OPEN = 101; private static final int IDM_SAVE = 102; public boolean onCreateOptionsMenu(menu Menu) ( // pridanie položiek menu menu.add(Menu.NONE, IDM_OPEN, Menu.NONE, "Open"); menu.add(Menu.NONE, IDM_SAVE, Menu.NONE, "Save") ;)

Pri metóde pridať () sú štyri možnosti:

  • identifikátor skupiny – umožňuje vám priradiť položku ponuky k skupine iných položiek v tejto ponuke
  • identifikátor položky pre obsluhu udalosti výberu položky ponuky
  • poradie položky v menu - umožňuje určiť pozíciu v menu. Štandardne (Menu.NONE alebo 0) položky idú v poradí špecifikovanom v kóde
  • nadpis – text, ktorý sa zobrazuje v položke ponuky. Môžete použiť reťazec zdroj

Metóda vracia objekt MenuItem, pomocou ktorého je možné nastaviť ďalšie vlastnosti, ako napríklad nastaviť ikonu, klávesovú skratku atď.

Ak chcete vytvoriť menu s ikonami, použite metódu setIcon()

Menu.add(Menu.NONE, IDM_OPEN, Menu.NONE, "Otvoriť") .setIcon(R.drawable.icon_menu_open);

Pripomeňme si, že ikony možno pridať iba do šiestich položiek ponuky (alebo do piatich, ak existuje viac ako šesť položiek).

Metóda onCreateOptionsMenu systém zavolá iba raz pri vytváraní menu. Ak potrebujete aktualizovať ponuku počas spustenia programu, použite metódu spätného volania onPrepareOptionsMenu().

Keď je vybratá položka ponuky, zavolá sa metóda onOptionsItemSelected, ktorá prechádza objektom MenuItem- položka ponuky zvolená používateľom. Pomocou metódy getItemId môžete získať ID vybranej položky ponuky. Po identifikácii položky ponuky môžete napísať kód na spracovanie udalosti výberu ponuky:

Verejná boolovská hodnota onOptionsItemSelected(položka MenuItem) ( prepínač (item.getItemId()) case IDM_OPEN: návrat true; case IDM_SAVE: return true; return false; )

Klávesové skratky

Môžete tiež nastaviť klávesové skratky pre rýchly prístup pomocou znakov klávesnice pomocou niekoľkých metód:

  • setAlphabeticShortcut(char) - pridá znak
  • setNumericShortcut(int) - pridá číslo
  • setShortcut(char, int) - Pridá kombináciu znaku a čísla

Ak napríklad nastavíte klávesovú skratku setAlphabeticShortcut("q");, potom keď otvoríte ponuku (alebo pri podržaní klávesu MENU), stlačením klávesu Q vyberie túto položku ponuky. Toto klávesová skratka(alebo klávesová skratka) sa zobrazí ako popis zobrazený pod názvom položky ponuky. Novšie klávesnice majú samostatný kláves ctrl, ktorý funguje rovnako ako na bežných klávesniciach.

Klávesové skratky je možné vytvoriť aj prostredníctvom XML: android:alphabeticShortcut="c".

Kliknutia môžete zvládnuť pomocou metódy aktivity 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, event); ) )

Vytvorenie podmenu

Podponuku možno pridať do ktorejkoľvek ponuky okrem inej podponuky. Podmenu je vytvorené metódou spätného volania onCreateOptionsMenu() pomocou metódy addSubMenu() ktorý vracia objekt podmenu. Namietať podmenu pomocou metódy môžete do tejto ponuky pridať ďalšie položky pridať (). Napríklad:

Public static final int IDM_HELP = 101; public static final int IDM_NEW = 201; public static final int IDM_OPEN = 202; public static final int IDM_SAVE = 203; public static final int IDM_CUT = 301; public static final int IDM_COPY = 302; public static final int IDM_PASTE = 303; @Override public boolean onCreateOptionsMenu(menu Menu) ( SubMenu subMenuFile = menu.addSubMenu("Súbor"); subMenuFile.add(Menu.NONE, IDM_NEW, Menu.NONE, "New"); subMenuFile.add(Menu.NONE, IDM_OPEN , Menu.NONE, "Otvoriť"); subMenuFile.add(Menu.NONE, IDM_SAVE, Menu.NONE, "Save"); SubMenu subMenuEdit = menu.addSubMenu("Edit"); subMenuEdit.add(Menu.NONE, IDM_CUT , Menu.NONE, "Vystrihnúť"); subMenuEdit.add(Menu.NONE, IDM_COPY, Menu.NONE, "Copy"); subMenuEdit.add(Menu.NONE, IDM_PASTE, Menu.NONE, "Vložiť"); menu. add(Menu.NONE, IDM_HELP, Menu.NONE, "Help"); return super.onCreateOptionsMenu(menu); ) @Override public boolean onOptionsItemSelected(MenuItem item) (Správa CharSequence; switch (item.getItemId()) (prípad IDM_NEW : message = "Vybratá nová položka"; break; case IDM_OPEN: message = "Otvoriť položku vybratú"; break; case IDM_SAVE: message = "Uložiť vybratú položku"; break; case IDM_CUT: message = "Vybratá položka bola vybratá"; break; case IDM_COPY:message= "Kopírovať vybratú položku"; prestávka; case IDM_PASTE: message = "Prilepiť vybrané"; prestávka; case IDM_HELP: message = "Vybraná položka pomocníka"; prestávka; predvolená hodnota: návrat false; ) // zobrazenie upozornenia na vybratú položku menu Toast toast = Toast.makeText(this, message, Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); vrátiť true; )

Teraz, keď vyberiete položku ponuky, zobrazí sa ďalšie okno s podponukou. Skúste to sami.

Pridanie začiarkavacích políčok a prepínačov

K položkám ponuky môžete pridať začiarkavacie políčka alebo prepínače. Ak chcete pridať začiarkavacie políčko alebo prepínač pre jednotlivú položku ponuky, musíte použiť metódu setCheckable():

Položka MenuItem = menu.add(0, IDM_FORMAT_BOLD, 0, "Tučné"); item.setCheckable(true);

Ak je potrebné pridať niekoľko položiek ponuky pomocou začiarkavacích políčok alebo prepínačov, môžete ich spojiť do skupín ponúk vytvorením samostatného identifikátora. Položka ponuky sa pridá do skupiny pomocou metódy pridať (), pričom mu ako prvý parameter odošlete ID skupiny menu. Povedzme, že sme deklarovali ID pre skupinu ponuky Farba a položky ponuky na nastavenie farby:

Verejná statická konečná int IDM_COLOR_GROUP = 400; public static final int IDM_COLOR_RED = 401; public static final int IDM_COLOR_GREEN = 402; public static final int IDM_COLOR_BLUE = 403;

Teraz, aby ste vytvorili skupinu menu so zaškrtávacími políčkami, musíte každej položke ponuky priradiť ID skupiny a zavolať metódu setGroupCheckable() pre celú skupinu (v tomto prípade nie je potrebné volať metódu setCheckable() pre každú položku ponuky):

SubMenu subMenuColor = menu.addSubMenu("Farba"); subMenuColor.add(IDM_COLOR_GROUP, IDM_COLOR_RED, Menu.NONE, "Červená"); subMenuColor.add(IDM_COLOR_GROUP, IDM_COLOR_GREEN, Menu.NONE,"Zelena"); subMenuColor.add(IDM_COLOR_GROUP, IDM_COLOR_BLUE, Menu.NONE, "Modrá"); subMenuColor.setGroupCheckable(IDM_COLOR_GROUP, pravda, nepravda);

Pri metóde setGroupCheckable() tri možnosti:

  • prvý parameter je ID skupiny menu;
  • druhý parameter je pravdivý, ak sú v skupine povolené prepínače alebo začiarkavacie políčka;
  • tretí parameter - nastavuje jeden (pravda) alebo viacnásobný (nepravdivý) výber položiek menu. Toto nastavenie vlastne určuje vzhľad menu – bude to menu s prepínačmi alebo zaškrtávacími políčkami.

    Ak chcete ovládať stav začiarkavacích políčok a prepínačov v obslužnom programe udalosti výberu položky ponuky, napíšte nasledovné:

    @Override public boolean onOptionsItemSelected (položka MenuItem) ( správa CharSequence; prepínač (item.getItemId()) ( ... case IDM_COLOR_RED: // invertovať stav začiarkavacieho políčka item.setChecked(!item.isChecked()); message = "Červená farba"; zlom; predvolené: návrat false; )

    Spustite projekt, vyvolajte ponuku a vyberte položku ponuky Farba. Budete mať podmenu s tromi položkami (Červená, Zelená, Modrá) vo forme vlajok. Stav zaškrtávacích políčok a prepínačov sa spracuje v programovom kóde a uloží sa pri opätovnom vyvolaní ponuky.

    Vybratej položke ponuky môžete okamžite priradiť zámer prostredníctvom metódy setIntent(), ktorá sa spustí po kliknutí na túto položku, ak túto udalosť nezachytili obslužné programy onMenuItemClickListener (zastarané) alebo onOptionsItemSelected. Po spustení sa zámer prenesie do metódy startActivity.

    MenuItem.setIntent(new Intent(this, MyOtherActivity.class));

    Programové otváranie alebo zatváranie menu

    Ak z nejakého dôvodu potrebujete programovo otvoriť ponuku (napríklad na demonštračné účely), použite metódu openOptionsMenu():

    OpenOptionsMenu();

    Ak chcete programovo zatvoriť ponuku, použite metódu closeOptionsMenu(), mám však opakované volanie metódy openOptionsMenu() tiež zatvorí menu.

    Programové odstránenie položky ponuky

    Povedzme, že sme definovali položku ponuky v súbore xml:

    Ak chcete odstrániť zjavne nepotrebnú položku ponuky z nášho programu pre mačky, musíme k položke ponuky pristupovať prostredníctvom metódy findItem() a urobiť ho neviditeľným. Do metódy musí byť odovzdaný odkaz na objekt Menu onCreateOptionsMenu aby sa program dozvedel o zmene zloženia jedálneho lístka.

    // premenná triedy Menu menu; @Override public boolean onCreateOptionsMenu(menu) ( super.onCreateOptionsMenu(menu); // odovzdanie referencie na náš objekt this.menu = menu; getMenuInflater().inflate(R.menu.test, menu); return true; ) / / button click public void onClick(View v) ( if (menu != null) ( // nájdite požadovanú položku MenuItem item_dog = menu.findItem(R.id.action_dog); // zneviditeľní item_dog.setVisible(false) ;)))

    ale toto rozhodnutie je tu nevýhoda, ak otočíme obrazovku, aktivita sa vytvorí znova a znova sa zobrazí vzdialené menu. Ako sa môžeme zbaviť škaredého psa?

    Musíme si zapamätať stav položky ponuky a uložiť ju do objektu typu Bundle v metóde onSaveInstanceState a v metóde onCreate() načítať uložený stav a prejsť do metódy onPrepareOptionsMenu, ktorý sa volá pred zobrazením ponuky na obrazovke:

    Balíček sk.alexanderklimov.test; importovať android.app.Activity; importovať android.os.Bundle; importovať android.view.Menu; importovať android.view.MenuItem; importovať android.view.View; verejná trieda TestActivity rozširuje aktivitu (ponuka Menu; boolovské uloženéMenuDogIsVisible; konečný statický reťazec KEY_MENU_DOG = "KEY_MENU_DOG"; @Override public void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); revelaContentView/R.trie údaje viditeľnosti položky ponuky if (savedInstanceState != null) ( SavedMenuDogIsVisible = SaveInstanceState.getBoolean(KEY_MENU_DOG, true); ) ) @Override public boolean onCreateOptionsMenu(menu Menu) ( super.onMenuCreateOptionsMenu =menu(menu;); ).inflate(R.menu.test, menu); return true; ) public void onClick(View v) ( if (menu != null) ( MenuItem item_dog = menu.findItem(R.id.action_dog); // skryť položka ponuky item_dog.setVisible(false); ) ) @Override protected void onSaveInstanceState(Bundle outState) ( // TODO Automaticky generovaná metóda stub super.onSaveInstanceState(outState); if (menu != null) ( MenuItem item_dog = menu. findItem(R.id.action_dog); // uložiť aktuálny stav položky menu - true alebo 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); // pred zobrazením požadovaného stavu menu item_dog.setVisible(IsVisible)MenuDog ; ) return super.onPrepareOptionsMenu(menu); ) )

    Zistiť prítomnosť tlačidla Menu

    Staršie zariadenia používali skutočné tlačidlo Menu. V nových verziách menu pre Android odstránené v ActionBar a jeho prítomnosť ako samostatného tlačidla sa stala voliteľnou. Mnoho výrobcov však stále vyrába telefóny s tlačidlom ponuky. Ak chcete zistiť, či takéto tlačidlo existuje, pridal sa Android 14 nová metóda, ktorý určí prítomnosť tohto tlačidla.

    If(Build.VERSION.SDK_INT<= 10 || (Build.VERSION.SDK_INT >= 14 && ViewConfiguration.get(this) .hasPermanentMenuKey())) ( // kláves ponuky je prítomný Toast.makeText(this, "Tlačidlo ponuky je", Toast.LENGTH_LONG).show(); ) else ( // Bez ponuky kľúč Toast.makeText(toto, "Žiadne tlačidlo Menu", Toast.LENGTH_LONG).show(); )

    Označenie pre menu

    V moderných zariadeniach je menu súčasťou ActionBar. A rozloženie menu si môžete prispôsobiť pomocou XML.

    Povedzme, že ste si vybrali túto možnosť:

    V atribúte showAsAction nepoužívajte hodnotu nikdy, inak značku neuvidíte. Samotné označenie je špecifikované prostredníctvom atribútu actionLayout. Značkovací kód:

    Menu vo fragmentoch

    Menu môže byť nielen súčasťou aktivity, ale aj súčasťou fragmentu. Princíp činnosti je prakticky rovnaký. Fragment má zodpovedajúcu metódu.

    @Override public void onCreateOptionsMenu(Menu, MenuInflater inflater) ( super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.fragment_crime_list, menu); )

    FragmentManager zodpovedný za hovor onCreateOptionsMenu() keď aktivita dostane spätné volanie onCreateOptionsMenu() zo systému. Musíte to výslovne povedať manažérovi FragmentManagerže fragment by sa mal zavolať onCreateOptionsMenu(). Na tento účel sa nazýva metóda setHasOptionsMenu():

    // V kóde fragmentu @Override public void onCreate(Bundle SavedInstanceState) ( super.onCreate(savedInstanceState); setHasOptionsMenu(true); getActivity().setTitle(R.string.cat); ... )

Pred verziou Honeycomb (Android 3.0) mali všetky zariadenia so systémom Android pod obrazovkou tlačidlo „menu“. Vývojári ho mohli používať podľa vlastného uváženia a na tomto tlačidle bolo vytvorených mnoho rozhraní aplikácií. Tabletovo orientovaný Honeycomb urobil krok smerom k mechanickým (a dotykovým) tlačidlám a v tomto smere v treťom verzie pre Android objavila sa trieda ActionBar, ktorá umožnila dať používateľovi rýchly prístup do nastavení aplikácie cez špeciálny panel nazývaný panel akcií. Podľa Google Developers Action Bar je budúcnosť a programátori by mali prestať používať tlačidlo „menu“. Na trhu v súčasnosti dominujú smartfóny s mechanickým resp dotykové tlačidlo pod obrazovkou, no s príchodom Ice Cream Sandwich sa situácia môže dramaticky zmeniť. Pre vás ako vývojára je dôležité, aby ste sa na vzhľad takýchto zariadení vopred pripravili a koncept Action bar využili už dnes.

Na prvý pohľad by sa mohlo zdať, že používanie lišty akcií spôsobí problémy pri vývoji programov pre Android 2.x, v ktorých táto lišta ešte nie je implementovaná. Tu však problém nie je. Nikto vám nezakazuje naďalej používať tlačidlo „ponuka“ na tých zariadeniach, kde sa nachádza, pridanie panela akcií bude vyžadovať, aby ste napísali iba niekoľko riadkov kódu.

Ak by som sa pokúsil tento článok zhrnúť do jednej vety, bolo by to: " Nastavte targetSdkVersion na 14 a označte showAsAction="ifRoom" na položkách ponuky, ktoré by sa mali vykresliť na paneli akcií".

Konečné odmietnutie ponuky nastavení v systéme Android

Nestačí len prestať používať tlačidlo „menu“, treba koncept úplne dostať z hlavy. Nevytvárajte menu, všetky potrebné tlačidlá si vytvorte priamo vo vnútri aktivít. Ak sa niektoré akcie nezmestia na panel, umiestnite ich do dodatočného rozbaľovacieho menu (pretečenie akcie). Na obrázku vyššie je zobrazený panel akcií s tlačidlom vyhľadávania a ďalšou ponukou na pravej strane panela.

Ak je vaša aplikácia vytvorená pre stará verzia android (ktorý tradične používa menu), potom po spustení na tablete so systémom Android 3 sa v spodnej časti obrazovky zobrazí panel, ktorý emuluje tri tlačidlá, ktoré existujú na telefónoch druhej pobočky.

Terminológia je dosť mätúca, no rozbaľovacia ponuka (pretečenie akcií) naznačuje úplne iný koncept použitia ako jednoduché menu nastavení. Namiesto toho, aby ste mysleli na menu ako na úložisko pre všetky nastavenia aplikácie, vytvoríte panel, do ktorého umiestnite hlavné nastavenia. Všetko sekundárne sa vyberie v rozbaľovacej ponuke, ktorá sa vyvolá po kliknutí na tlačidlo s tromi bodkami (tlačidlo pretečenia akcie) na pravej strane panela.

tlačidlo pretečenia akcie

Ak ste spúšťali aplikácie napísané pre Android 2.3 a nižší na zariadeniach bez tlačidiel pod obrazovkou (napríklad na tablete s Honeycomb alebo na Galaxy Nexus), možno ste si všimli, že sa vedľa obrázka zobrazuje tlačidlo Action overflow tri tlačidlá na paneli v spodnej časti (tri bodky nad sebou). Toto je kompromis, ale nie veľmi dobrý. V aplikáciách, ktoré vôbec nevyužívajú menu nastavení, toto tlačidlo nerobí nič, obťažuje používateľov. Preto by bolo veľmi dobrým riešením nasledovať verzia pre Android a ak váš program beží v systéme Android 3.0+, odstráňte toto tlačidlo z navigačného panela a použite panel akcií. Tento prístup vám umožňuje zachovať kompatibilitu programu so starými zariadeniami a zatraktívniť ho pre nové.

Ak váš program beží na zariadeniach bez tlačidiel, systém rozhodne, či má pridať na navigačnú lištu pretečenie akcií v závislosti od hodnoty poľa v manifeste. Logika je nasledovná

  • Ak nastavíte minSdkVersion alebo targetSdkVersion na hodnotu vyššiu ako 11, systém toto tlačidlo nepridá.
  • Na druhej strane systém toto tlačidlo vytvorí pri spustení aplikácie v systéme Android 3.0 a novšom.
  • Jedinou výnimkou je, keď nastavíte minSdkVersion na 10 alebo nižšiu; targetSdkVersion na 11, 12 alebo 13 a nebude používať ActionBar, systém pridá toto tlačidlo na telefónoch (nie tabletoch) pod Ovládanie Androidom 4.0 a vyššie. Táto výnimka je založená na nasledujúcej myšlienke: ak vyvíjate aplikáciu pre telefóny druhej vetvy a pre tablety tretej, potom predpokladáte, že telefóny by mali mať tlačidlo ponuky, ale tablety nie.

Ak teda chcete zakázať pretečenie tlačidla na navigačnom paneli, musíte nastaviť targetSdkVersion na 14 (môžete napísať viac ako nízka hodnota aby program mohol bežať na starších zariadeniach).

Prechod na koncept akčného baru

Ak máte aktivity, ktoré používajú ponuku možností (vytvorenú pomocou onCreateOptionsMenu()), potom odstránením tlačidla z navigačnej lišty (nastavením targetSdkVersion=14) by ste mali používateľovi poskytnúť alternatívny spôsob prístupu k možnostiam. Našťastie nemusíte robiť veľa práce, pretože systém automaticky vytvorí panel akcií.

Pridajte showAsAction="ifRoom" do svojich značiek prvky, ktoré chcete vložiť do panela akcií. Ak si nie ste istí, ktorý prvok zahrnúť do panela akcií, pozrite si príručku panela akcií dizajnu Android .

Aby bolo vnímanie vášho programu holistické, odporúčame vám použiť ikony z tím Android UX. Archív .

Ako odstrániť panel akcií z aplikácie pre Android

Ak panel akcií nepotrebujete, môžete ho odstrániť z akejkoľvek aktivity alebo dokonca z aplikácie. To môže byť relevantné pre hry a programy, ktoré nepoužívajú ponuku nastavení. Panel akcií môžete odstrániť pomocou motívu Theme.Holo.NoActionBar alebo Theme.DeviceDefault.NoActionBar.

Ak chcete použiť tieto schémy, ale ponechajte spätne kompatibilné, môžete použiť systém správy zdrojov na nastavenie rôznych tém rôzne verzie platformy. Tejto téme sa venujeme podrobnejšie tu. Budete si musieť vytvoriť vlastnú tému, ktorá bude dediť z tém rôzne platformy v závislosti od aktuálnej verzie.

Môžete napríklad deklarovať tému pre svoju aplikáciu

(alebo pre konkrétnu aktivitu v značke ).

Pre zariadenia so systémom Android 2 zahrňte nasledujúci motív do súboru res/values/themes.xml.



Pre Honeycomb zahrňte nasledujúcu tému do res/values-v11/themes.xml.



Pri spustení, v závislosti od verzie API, systém vyberie vhodnú tému.

Záver

Zopakujme si hlavné myšlienky a body článku:

  • Na nový Android Zariadenia nemusia mať tlačidlo "menu", takže pri vývoji programov je najlepšie ho nepoužívať vôbec.
  • Nastavte targetSdkVersion = 14 a otestujte svoju aplikáciu v systéme Android 4.0.
  • Pridajte značku showAsAction="ifRoom" do položku ponuky, ak chcete, aby automaticky prešla na panel akcií.
  • Ak vaša aplikácia nepoužíva ActionBar, môžete ho odstrániť pomocou motívov Theme.Holo.NoActionBar a Theme.DeviceDefault.NoActionBar.

Android podporuje niekoľko typov menu. Po prvé - na telefóne je samostatné tlačidlo Ponuka(v starších telefónoch), stlačením sa zobrazí ponuka. V nových zariadeniach bolo odstránené samostatné tlačidlo a nahradilo ho ikonou ponuky tri bodky vo vertikálnej orientácii. Druhým typom je kontextové menu, ktoré sa zobrazí po stlačení a podržaní prsta na obrazovke v správne miesto(Môžete tiež stlačiť a podržať stredné tlačidlo na telefóne). Obsahové menu zase môže mať podmenu. Dnes sa zoznámime s prvým typom jedálnička. Tento článok sa bude zaoberať prácou s ponukou na nových zariadeniach so systémom Android 4.0 a vyšším.

V šablóne prázdna činnosť menu nie je, tak si ho vytvoríme sami. To vám pomôže pochopiť, ako to funguje, a získať všeobecnú predstavu o projekte. Na manipuláciu s výberom položiek ponuky nie je potrebné zapamätať si názvy tried, metód a kódov. V iných šablónach bude menu zabudované a môžete ho ihneď použiť.

Vytvorte nový projekt založené prázdna činnosť a spustite ho. Zatiaľ tu nie je žiadne menu.

Vytvorte viacero reťazcov v súbore res/values/strings.xml, ktorý bude zodpovedný za položky menu:

nastavenie Cat Cat Kitty

Teraz vytvorte nový priečinok Ponuka v priečinku res res, | Nový | Adresár). Ďalej vytvorte súbor vo vytvorenom priečinku menu_main.xml- názov naznačuje, že jedálny lístok patrí k hlavnej činnosti Hlavná činnosť(kliknite pravým tlačidlom myši na priečinok Ponuka | Nový | Ponuka Resource File). Ak vytvoríte aplikáciu s viacerými obrazovkami, každá aktivita bude mať samostatné menu s vlastnými nastaveniami. Pri otváraní súboru menu_main.xml a pridajte náš kód do výslednej šablóny:

Otvorme súbor Hlavná činnosť. Momentálne má len jednu metódu. onCreate(). Pridajme novú metódu onCreateOptionsMenu(). presne tak túto metódu zodpovedá za vzhľad jedálneho lístka v činnosti. Vyberte si z ponuky štúdia kód| a v ďalšom okne začnite písať názov metódy prvými písmenami. Možno zadať ako prvý veľké písmená, t.j. ocom( o n C sadzba O možnosti M enu), aby ste rýchlo našli požadovaný reťazec. Stlačíme tlačidlo OK a dostaneme obrobok.

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

Do prípravy pridávame metódu, ktorá preberá údaje zo zdrojov ponuky a prevádza ich na položky ponuky na obrazovke.

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

V metóde nafúknuť () ukazujete na zdroj ponuky ( R.menu.menu_main) a objekt triedy Ponuka.

V angličtine je „inflate“ preložené ako nafúknuť, t.j. podľa návrhu android vývojári, trochu nafúkneme objekt údajmi, napríklad menu. Ale v skutočnosti slovo "nafúknuť" pochádza z frázy plochý- do bytu. Existuje stará tradícia vypustiť do bytu prvú mačku, ktorá preskúma všetky zákutia domu a vyhlási svoj súhlas s bývaním v ňom. Dáta z XML súboru teda spustíme do objektu MenuInflater.

Spustite projekt. Teraz na pravej strane hlavičky uvidíte ikonu troch bodiek usporiadaných v vertikálna čiara. Kliknutím na ikonu zobrazíte položku ponuky nastavenie.

Ako to nie je ťažké uhádnuť, prvok položka je zodpovedný za samostatnú položku menu. Rovnakým spôsobom pridáme ďalšie tri položky, pričom zmeníme iba identifikátor a text ponuky:

Spustite projekt a skúste znova vyvolať ponuku. Uvidíte tri nové položky.

možnosti id a titul netreba vysvetlenie. Parameter orderInCategory vám umožňuje nastaviť si vlastné poradie zobrazenia položiek ponuky. Predpokladajme, že ste vytvorili päť položiek ponuky, ale ešte ste sa nerozhodli, v akom poradí sa zobrazia na obrazovke. Aby ste nepresúvali neustále celé bloky kódu pre položky ponuky správne poradie, môžete použiť túto možnosť.

A nakoniec dôležitý atribút app:showAsAction definuje správanie menu v ActionBar. Význam nikdy znamená, že položka menu sa nemá zobrazovať v hlavičke, ale iba vo vyskakovacom menu, t.j. byť za tromi bodkami. Ak nastavíte hodnotu vždy, potom bod nastavenie sa okamžite objaví v hlavičke vašej aplikácie. Tiež dostupné hodnoty ifRooms, withText a zbaliťActionView. Skúste to sami. Napríklad, ifRoom Zobrazí položku ponuky, ak to priestor dovoľuje. Ak je bodov veľa, potom budú len prekážať. Táto možnosť spravidla zobrazuje veľmi krátke slovo alebo ikonu pre časté operácie, aby ste sa vyhli zbytočným kliknutiam na tri bodky.

Všimnite si atribút app:showAsAction, ktorý patrí do menného priestoru xmlns:app="http://schemas.android.com/apk/res-auto". Boli časy, keď takýto menný priestor neexistoval a projekty tento atribút používali android:showAsAction zo štandardného priestoru názvov. Ak bude štúdio nadávať na chybu, upravte kód.

Kým sa nespustia položky ponuky užitočná práca. Každé kliknutie na položku jednoducho zatvorí ponuku bez viditeľných následkov. Kód na spracovanie kliknutí sme ešte nenapísali.

Výber položiek ponuky

Naučili sme sa vytvárať menu. Ale zatiaľ je to zbytočné, keďže položky menu nijako nereagujú na naše kliknutia. Iná metóda sa používa na spracovanie kliknutí na ponuku. onOptionsItemSelected(). Pridajme metódu rovnakým spôsobom ako v predchádzajúcom príklade. Poďme na prípravu.

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

Parameter položka zodpovedný za položku menu. Pomocou metódy by ste mali získať ID ponuky getItemId() a zadajte k nemu kód. Keďže menu zvyčajne pozostáva z niekoľkých položiek, je vhodné použiť konštrukcie ak/inak alebo prepínač. Na zobrazenie informácií používame textový štítok. Pridajte komponent na obrazovku aktivity textové zobrazenie. Môžete použiť existujúce textové zobrazenie s nápisom „Ahoj svet!“, stačí mu dať ID.

android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Ahoj svet!"/>

Pridajme kód do prázdneho miesta pre vybratú položku ponuky:

@Override public boolean onOptionsItemSelected(položka MenuItem) ( // Získanie ID vybratej položky ponuky int id = item.getItemId(); TextView infoTextView = (TextView) findViewById(R.id.textView); // Operácie pre vybraté položka menu switch ( id) ( case R.id.action_cat1: infoTextView.setText("Vybrali ste si mačku!"); return true; case R.id.action_cat2: infoTextView.setText("Vybrali ste si mačku!"); return true; case R. id.action_cat3: infoTextView.setText("Vybrali ste si mačiatko!"); return true; default: return super.onOptionsItemSelected(item); ) )

Spustite aplikáciu, vyvolajte ponuku a vyberte ľubovoľnú položku ponuky. V textovom poli by sa mala zobraziť správa.

Existuje alternatívny spôsob cez XML podobne ako pri klikaní na tlačidlá (od Androidu 3.0). Môžete pridať atribút android:onclick v zdrojoch ponuky a nemusíte používať volanie metódy onOptionsItemSelected(). S pomocou android:onclick pri výbere položky ponuky môžete určiť požadovanú metódu. Pridajte tento atribút k položke nastavenie

Teraz do kódu aktivity napíšeme nasledovné:

// atribút položky ponuky Nastavenia je nastavený na android:onClick="onSettingsMenuClick" public void onSettingsMenuClick(položka MenuItem) ( TextView infoTextView = (TextView) findViewById(R.id.textView); infoTextView.setText("Vybrali ste nastavenia, radšej by som si vybral mačku");)

Prepínače

Vzhľad položiek ponuky je možné zmeniť na zobrazenie pomocou prepínačov. Ak to chcete urobiť, pridajte prvok skupina s prívlastkom android:checkableBehavior="single":

V tomto režime nevidím veľký zmysel. A nebudeme to zvažovať.

Režim dizajnu

Android Studio 2.2 pridalo grafický režim na vytváranie ponúk, ktoré vyzerajú ako panel nástrojov na pridávanie nových komponentov na obrazovku. Panel s ponukami pozostáva zo štyroch prvkov: Položka menu, Hľadať položku, Ponuka, skupina.

Princíp je rovnaký, vyberte požadovaný prvok a presuňte ho na obrazovku do oblasti ponuky. Ak ste sa naučili manuálne vytvárať menu, potom túto metódu nespôsobí vám žiadne problémy. S ním môžete rýchlo načrtnúť štruktúru ponuky a potom ju manuálne vyladiť.