první měsíc tréninku. Pojďme se na nabídku podívat blíže. Zvažována budou jak stará zařízení Android 2.3, tak nové telefony Android 4.0.

Nabídka možností

Za jídelníček zodpovídá třída android.view.Menu. Každá aktivita je spojena s jedním objektem nabídky. Samotné menu obsahuje položky menu (class android.view.MenuItem) a podnabídka (třída android.view.SubMenu).

Když stisknete tlačítko Jídelní lístek na starších telefonech se zobrazí sada položek nabídky připojená k aktivitě. Nabídka může obsahovat ikony. Takové menu může obsahovat šest položek (zpravidla). Pokud je položek více než šest, použije se rozšířené menu - v tomto případě se místo šesté položky zobrazí položka Možnosti(více). Po stisknutí této položky se zobrazí rozšířená nabídka se seznamem položek, které se nevešly do hlavní části nabídky výběru možností.

Při prvním otevření nabídky Android zavolá metodu onCreateOptionsMenu(), předávání objektu jako parametru Jídelní lístek. Nabídky lze vytvořit jako prostředky v souboru XML nebo můžete použít přidat().

Ve standardním projektu je při výběru běžné šablony již mezera pro jednobodové menu Nastavení a volání metody pro menu (o tom už víte).

Vytvoření menu pomocí zdrojů

Zvažte práci s nabídkou prostřednictvím zdrojů. K vytvoření nabídky se používají prostředky, které musí být uloženy v souboru XML. Samotný soubor musí být ve složce res/menu/ váš projekt. Menu se skládá z následující položky:

Určuje nabídku, která bude obsahovat položky nabídky. Živel musí být kořenovým prvkem ve struktuře XML souboru a může obsahovat jeden nebo více prvků a Přímo vytváří položky nabídky. Tento prvek může mít vnořený prvek pro vytvoření podnabídky Volitelně můžete také použít kontejner neviditelných prvků . To vám umožní dosáhnout některých efektů

Předpokládejme, že se rozhodneme použít menu pro nějakou hru. Pojďme tvořit nový soubor game_menu.xml:

Vytvořili jsme menu se dvěma položkami. Každá položka obsahuje následující atributy:

Android:id Identifikátor položky nabídky, podle kterého může aplikace rozpoznat, když uživatel vybere položku nabídky android:title Text, který se zobrazí v nabídce

Pro prvek existují další atributy položka, například android:icon="@drawable/home" zobrazí také ikonu položky nabídky a android:enabled="false" umožňuje znepřístupnit položku nabídky.

Atribut android:titleCondensed používá se, když je běžný titul příliš široký, aby se „vešel“ do vybrané položky nabídky.

Atribut android:orderInCategory definuje pořadí, ve kterém se položky nabídky MenuItems zobrazují.

Při vytváření nabídky jsme poukázali na zdroje řetězců @string/nová_hra a @string/help. Je třeba přidat nové řádky do souboru strings.xml:

Nová hra Odkaz

Nyní musíme provést změny ve třídě aktivity, ve které se bude nabídka zobrazovat. Program by měl převést zdroj nabídky, který jsme vytvořili, na objekt programu. Pro tento účel existuje speciální metoda. MenuInflater.inflate(), která se volá speciální metodou zpětné volání onCreateOptionsMenu(). Tato metoda je navržena tak, aby po stisknutí tlačítka zobrazila nabídku. JÍDELNÍ LÍSTEK na zařízení:

@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é prostředí požádá o import chybějících jmenných prostorů.

Importovat android.view.Menu; importovat android.view.MenuInflater;

Metoda onCreateOptionsMenu() metoda zahájí první zobrazení nabídky na obrazovce a jako parametr převezme objekt nabídky (pro starší zařízení). Můžete si uložit odkaz na nabídku a použít jej kdekoli v kódu, pokud je to metoda onCreateOptionsMenu() nebude znovu voláno. Vždy byste měli používat implementaci rodičovské třídy tohoto handleru, protože v případě potřeby automaticky zahrnuje další systémové položky v nabídce. V nových zařízeních se metoda volá při vytvoření aktivity. Metoda musí vrátit hodnotu skutečný aby byla nabídka viditelná na obrazovce.

Po spuštění programu stiskněte tlačítko JÍDELNÍ LÍSTEK na emulátoru, abyste viděli vytvořenou nabídku.

Metoda getMenuInflater() vrátí instanci třídy nafukovač menu, který používáme ke čtení dat menu z XML.

Jak vidíte, nabídka se zobrazí ve spodní části obrazovky. Současně lze zobrazit celkem šest položek nabídky. Pokud je bodů více, zobrazí se pět bodů plus šestý bod Více, což vám umožní zobrazit zbytek položek. Pojďme otestovat a přidat nové položky nabídky.

Nejprve přidáme šest bodů.

Přidejme do nabídky ještě jednu položku, aby jich bylo sedm.

Výběr položek nabídky

Naučili jsme se, jak vytvořit jídelníček. Zatím je to ale k ničemu, jelikož položky menu na naše kliknutí nijak nereagují. Metoda se používá ke zpracování kliknutí na položky nabídky. onOptionsItemSelected(). Metoda rozpoznává položku vybranou uživatelem prostřednictvím MenuItem. Vybranou položku nyní můžeme určit voláním getItemId(), která vrátí ID položky nabídky. Dále přes operátora přepínač zbývá nám definovat potřebné příkazy:

@Override public boolean onOptionsItemSelected(položka MenuItem) ( // Operace pro přepínač vybrané položky nabídky (item.getItemId()) ( case R.id.new_game: newGame(); return true; case R.id.help: showHelp( ) ; return true; výchozí: return super.onOptionsItemSelected(item); ) ) public void newGame() ( edtext.setText("Vybrána nová hra"); ) public void showHelp() ( edtext.setText("Vybrána nápověda" ) ;)

Spusťte aplikaci, vyvolejte nabídku a vyberte první nebo druhou položku nabídky. V textovém poli by se měla objevit zpráva.

V uvedeném příkladu getItemId() požádá o ID pro vybranou položku nabídky a začne porovnávat prostřednictvím příkazu pro výběr přepínače s ID, která jsme nastavili ve zdrojích XML. Po nalezení požadovaného identifikátoru se provede handler pro danou položku nabídky. Pokud program nic nenajde, příkaz se provede výchozí, která vrací supertřídu.

V systému Android 3.0 můžete přidat atribut android:onclick ve zdrojích nabídky a už je nemusíte používat onOptionsItemSelected(). S pomocí android:onclick můžete určit požadovanou metodu při výběru položky nabídky.

// atribut položky menu nastaven na android:onClick="onMenuClick" public void onMenuClick(položka MenuItem)( edtext.setText("Nakrmit kočku vybráno"); )

Tvorba menu programově

Zvážit tvorba softwaru menu pro úplnost. Budeme muset definovat několik konstant pro položky nabídky:

// identifikátory položek menu private static final int IDM_OPEN = 101; private static final int IDM_SAVE = 102; public boolean onCreateOptionsMenu(menu Menu) ( // přidání položek menu menu.add(Menu.NONE, IDM_OPEN, Menu.NONE, "Otevřít"); menu.add(Menu.NONE, IDM_SAVE, Menu.NONE, "Uložit") ;)

U metody přidat() jsou čtyři možnosti:

  • identifikátor skupiny – umožňuje přiřadit položku nabídky ke skupině dalších položek v této nabídce
  • identifikátor položky pro obsluhu události výběru položky nabídky
  • pořadí položky v menu - umožňuje určit pozici v menu. Ve výchozím nastavení (Menu.NONE nebo 0) položky jdou v pořadí uvedeném v kódu
  • title – text, který se zobrazuje v položce nabídky. Můžete použít prostředek řetězce

Metoda vrací objekt MenuItem, který lze použít k nastavení dalších vlastností, jako je sada ikon, klávesová zkratka atd.

Pokud chcete vytvořit menu s ikonami, použijte metodu setIcon()

Menu.add(Menu.NONE, IDM_OPEN, Menu.NONE, "Otevřít") .setIcon(R.drawable.icon_menu_open);

Znovu si připomeňme, že ikony lze přidat pouze k šesti položkám nabídky (nebo pěti, pokud je položek více než šest).

Metoda onCreateOptionsMenu volá systém pouze jednou při vytvoření nabídky. Pokud potřebujete aktualizovat nabídku za běhu programu, použijte metodu zpětného volání onPrepareOptionsMenu().

Když je vybrána položka nabídky, je volána metoda onOptionsItemSelected, která objekt míjí MenuItem- položka nabídky vybraná uživatelem. Pomocí metody getItemId můžete získat ID vybrané položky nabídky. Po identifikaci položky nabídky můžete napsat kód pro zpracování události výběru nabídky:

Veřejná logická hodnota onOptionsItemSelected(položka MenuItem) ( switch (item.getItemId()) case IDM_OPEN: návrat true; case IDM_SAVE: return true; return false; )

Klávesové zkratky

Můžete také nastavit klávesové zkratky pro rychlý přístup pomocí znaků klávesnice pomocí několika metod:

  • setAlphabeticShortcut(char) - přidá znak
  • setNumericShortcut(int) - přidá číslo
  • setShortcut(char, int) - Přidá kombinaci znaku a čísla

Pokud například nastavíte klávesovou zkratku setAlphabeticShortcut("q");, pak při otevření nabídky (nebo při podržení klávesy MENU) stiskněte klávesu Q vybere tuto položku nabídky. Tento klávesová zkratka(nebo klávesová zkratka) se zobrazí jako nápověda pod názvem položky nabídky. Novější klávesnice mají samostatnou klávesu ctrl, který funguje stejně jako na běžných klávesnicích.

Klávesové zkratky lze také vytvořit pomocí XML: android:alphabeticShortcut="c".

Prokliky zvládnete pomocí metody aktivity onKeyShortcut():

@Override public boolean onKeyShortcut(int keyCode, KeyEvent událost) ( switch (keyCode) (case KeyEvent.KEYCODE_R: Toast.makeText(this, "Reply", Toast.LENGTH_SHORT).show(); return true; default: return super. onKeyShortcut(keyCode, událost); ) )

Vytvoření podnabídky

Podnabídku lze přidat do libovolné nabídky kromě jiné podnabídky. Podnabídka je vytvořena metodou zpětného volání onCreateOptionsMenu() pomocí metody addSubMenu() která vrací objekt podnabídka. Namítat podnabídka můžete do této nabídky přidat další položky pomocí této metody přidat(). Napří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("Soubor"); subMenuFile.add(Menu.NONE, IDM_NEW, Menu.NONE, "New"); subMenuFile.add(Menu.NONE, IDM_OPEN , Menu.NONE, "Otevřít"); subMenuFile.add(Menu.NONE, IDM_SAVE, Menu.NONE, "Save"); SubMenu SubMenuEdit = menu.addSubMenu("Edit"); subMenuEdit.add(Menu.NONE, IDM_CUT , Menu.NONE, "Cut"); subMenuEdit.add(Menu.NONE, IDM_COPY, Menu.NONE, "Copy"); subMenuEdit.add(Menu.NONE, IDM_PASTE, Menu.NONE, "Vložit"); menu. add(Menu.NONE, IDM_HELP, Menu.NONE, "Help"); return super.onCreateOptionsMenu(menu); ) @Override public boolean onOptionsItemSelected(MenuItem item) (Zpráva CharSequence; switch (item.getItemId()) (případ IDM_NEW : message = "Vybrána nová položka"; break; case IDM_OPEN: message = "Otevřít položku vybrána"; break; case IDM_SAVE: message = "Uložit položku vybránu"; break; case IDM_CUT: message = "Vybrána položka byla vybrána"; break; case IDM_COPY:message= "Kopírovat vybranou položku"; přestávka; case IDM_PASTE: message = "Vložit vybráno"; přestávka; case IDM_HELP: message = "Vybrána položka nápovědy"; přestávka; výchozí: return false; ) // zobrazí upozornění na vybranou položku menu Toast toast = Toast.makeText(this, message, Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); vrátit true; )

Nyní, když vyberete položku nabídky, zobrazí se další okno s podnabídkou. Zkus to sám.

Přidání zaškrtávacích políček a přepínačů

K položkám nabídky můžete přidat zaškrtávací políčka nebo přepínače. Chcete-li přidat zaškrtávací políčko nebo přepínač pro jednotlivou položku nabídky, musíte použít metodu setCheckable():

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

Pokud je potřeba přidat několik položek nabídky se zaškrtávacími políčky nebo přepínači, můžete je sloučit do skupin nabídek vytvořením samostatného identifikátoru. Položka nabídky se do skupiny přidá pomocí metody přidat(), předá mu ID skupiny nabídek jako svůj první parametr. Řekněme, že jsme deklarovali ID pro skupinu nabídky Barva a položky nabídky pro nastavení barvy:

Public static final 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;

Chcete-li nyní vytvořit skupinu nabídek se zaškrtávacími políčky, musíte každé položce nabídky přiřadit ID skupiny a zavolat metodu setGroupCheckable() pro celou skupinu (v tomto případě není nutné volat metodu setCheckable() pro každou položku nabídky):

SubMenu subMenuColor = menu.addSubMenu("Barva"); 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, true, false);

U metody setGroupCheckable() tři možnosti:

  • prvním parametrem je ID skupiny nabídek;
  • druhý parametr má hodnotu true, pokud jsou ve skupině povoleny přepínače nebo zaškrtávací políčka;
  • třetí parametr - nastavuje jeden (true) nebo více (false) výběr položek menu. Toto nastavení ve skutečnosti určuje vzhled nabídky – bude to nabídka s přepínači nebo zaškrtávacími políčky.

    Chcete-li ovládat stav zaškrtávacích políček a přepínačů v obslužné rutině události výběru položky nabídky, napište následující:

    @Override public boolean onOptionsItemSelected(položka MenuItem) ( zpráva CharSequence; přepínač (item.getItemId()) ( ... case IDM_COLOR_RED: // invertuje stav zaškrtávacího pole item.setChecked(!item.isChecked()); zpráva = "Červená barva"; přerušení; výchozí: návrat false; )

    Spusťte projekt, vyvolejte nabídku a vyberte položku nabídky Barva. Budete mít podnabídku se třemi položkami (Červená, Zelená, Modrá) ve formě vlajek. Stav zaškrtávacích políček a přepínačů je zpracován v kódu programu a je uložen při opětovném vyvolání nabídky.

    Vybrané položce nabídky můžete okamžitě přiřadit záměr pomocí metody setIntent(), která se spustí po kliknutí na tuto položku, pokud tuto událost nezachytily obslužné programy onMenuItemClickListener (zastaralé) nebo onOptionsItemSelected. Po spuštění je záměr předán metodě startActivity.

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

    Programové otevírání nebo zavírání nabídky

    Pokud z nějakého důvodu potřebujete programově otevřít nabídku (například pro demonstrační účely), použijte metodu openOptionsMenu():

    OpenOptionsMenu();

    Chcete-li programově zavřít nabídku, použijte metodu closeOptionsMenu(), nicméně mám opakované volání metody openOptionsMenu() také zavře menu.

    Programové odebrání položky nabídky

    Řekněme, že jsme definovali položku nabídky v souboru xml:

    Abychom odstranili zjevně nepotřebnou položku nabídky z našeho kočičího programu, musíme k položce nabídky přistupovat prostřednictvím této metody findItem() a učinit ji neviditelnou. Metodě musí být předán odkaz na objekt Menu onCreateOptionsMenu aby se program dozvěděl o změně skladby jídelníčku.

    // proměnná třídy Menu menu; @Override public boolean onCreateOptionsMenu(menu Menu) ( super.onCreateOptionsMenu(menu); // předání odkazu na náš objekt this.menu = menu; getMenuInflater().inflate(R.menu.test, menu); return true; ) / / tlačítko klikněte na public void onClick(View v) ( if (menu != null) ( // najděte požadovanou položku MenuItem item_dog = menu.findItem(R.id.action_dog); // zneviditelnění item_dog.setVisible(false) );))

    Ale toto rozhodnutí je tu nevýhoda, pokud otočíme obrazovku, aktivita se znovu vytvoří a znovu se objeví vzdálené menu. Jak se můžeme zbavit ošklivého psa?

    Musíme si zapamatovat stav položky nabídky a uložit ji do objektu typu Bundle v metodě onSaveInstanceState a v metodě onCreate() načíst uložený stav a předat metodě onPrepareOptionsMenu, která se volá před zobrazením nabídky na obrazovce:

    Balíček en.alexanderklimov.test; importovat android.app.Activity; importovat android.os.Bundle; importovat android.view.Menu; importovat android.view.MenuItem; importovat android.view.View; veřejná třída TestActivity rozšiřuje aktivitu (nabídka Menu; booleovská uloženáMenuDogIsVisible; konečný statický řetězec KEY_MENU_DOG = "KEY_MENU_DOG"; @Override public void onCreate(Bundle SavedInstanceState) ( super.onCreate(savedInstanceState); revelaContentView/R.trie data viditelnosti položky nabídky if (savedInstanceState != null) ( SavedMenuDogIsVisible = SaveInstanceState.getBoolean(KEY_MENU_DOG, true); ) ) @Override public boolean onCreateOptionsMenu(menu Menu) ( super.MenuCreateOptionsMenu =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); // hide položka nabídky item_dog.setVisible(false); ) ) @Override protected void onSaveInstanceState(Bundle outState) ( // TODO Automaticky generovaná metoda stub super.onSaveInstanceState(outState); if (menu != null) ( MenuItem item_dog = menu. findItem(R.id.action_dog); // uložit aktuální stav položky nabídky - true nebo 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); // před zobrazením požadovaného stavu menu item_dog.setVisible(IsVisible)MenuDog ; ) return super.onPrepareOptionsMenu(menu); ) )

    Detekce přítomnosti tlačítka Menu

    Starší zařízení používala skutečné tlačítko Menu. V nových verzích menu pro Android odstraněn v ActionBar a jeho přítomnost jako samostatného tlačítka se stala volitelnou. Mnoho výrobců ale stále vyrábí telefony s tlačítkem menu. Chcete-li zjistit, zda takové tlačítko existuje, přidal Android 14 nová metoda, který určí přítomnost tohoto tlačítka.

    If(Build.VERSION.SDK_INT<= 10 || (Build.VERSION.SDK_INT >= 14 && ViewConfiguration.get(this) .hasPermanentMenuKey())) ( // klávesa nabídky je přítomna Toast.makeText(this, "Tlačítko nabídky je", Toast.LENGTH_LONG).show(); ) else ( // Žádná nabídka klíč Toast.makeText(this, "Žádné tlačítko Menu", Toast.LENGTH_LONG).show(); )

    Označení pro menu

    V moderních zařízeních je menu součástí ActionBar. A rozvržení menu si můžete přizpůsobit pomocí XML.

    Řekněme, že jste zvolili tuto možnost:

    V atributu showAsAction hodnotu nepoužívejte nikdy, jinak označení neuvidíte. Samotné označení je specifikováno prostřednictvím atributu actionLayout. Značkovací kód:

    Menu ve fragmentech

    Menu může být nejen součástí aktivity, ale také součástí fragmentu. Princip fungování je prakticky stejný. Fragment má odpovídající metodu.

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

    FragmentManager odpovědný za hovor onCreateOptionsMenu() když aktivita obdrží zpětné volání onCreateOptionsMenu() ze systému. Musíte to výslovně říct manažerovi FragmentManagerže by měl být fragment zavolán onCreateOptionsMenu(). Za tímto účelem se nazývá metoda setHasOptionsMenu():

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

Před Honeycomb (Android 3.0) měla všechna zařízení Android pod obrazovkou tlačítko „menu“. Vývojáři jej mohli používat, jak uznali za vhodné, a mnoho rozhraní aplikací bylo postaveno kolem tohoto tlačítka. Tabletově orientovaný Honeycomb udělal krok od mechanických (a dotykových) tlačítek a v tomto ohledu ve třetí verze pro Android objevila se třída ActionBar, která umožňovala dát uživateli rychlý přístup do nastavení aplikace prostřednictvím speciálního panelu zvaného panel akcí. Podle Google Developers Action Bar je budoucnost a programátoři by měli přestat používat tlačítko "menu". Na trhu v současnosti dominují smartphony s mechanickým popř dotykové tlačítko pod obrazovkou, ale s příchodem Ice Cream Sandwich se situace může dramaticky změnit. Pro vás jako vývojáře je důležité se na vzhled takových zařízení předem připravit a koncept Action bar používat již dnes.

Na první pohled se může zdát, že používání Action Baru způsobí problémy při vývoji programů pro Android 2.x, ve kterých tato lišta ještě není implementována. Zde však žádný problém není. Nikdo vám nezakazuje nadále používat tlačítko „nabídka“ na zařízeních, kde je přítomno, přidání panelu akcí bude vyžadovat, abyste napsali pouze několik řádků kódu.

Kdybych se pokusil tento článek shrnout do jedné věty, bylo by to: " Nastavte targetSdkVersion na 14 a označte showAsAction="ifRoom" u položek nabídky, které by se měly vykreslit na panelu akcí".

Konečné odmítnutí nabídky nastavení v systému Android

Nestačí jen přestat používat tlačítko „menu“, je potřeba koncept úplně dostat z hlavy. Nevytvářejte menu, vytvářejte všechna potřebná tlačítka přímo uvnitř aktivit. Pokud se některé akce nevejdou na panel, umístěte je do dalšího rozbalovacího menu (přetečení akcí). Výše uvedený obrázek ukazuje panel akcí s tlačítkem pro vyhledávání a další nabídkou na pravé straně panelu.

Pokud je vaše aplikace vytvořena pro stará verze Android (který tradičně používá menu), pak po spuštění na tabletu Android 3 se ve spodní části obrazovky zobrazí panel, který emuluje tři tlačítka, která existují na telefonech druhé větve.

Názvosloví je dost matoucí, ale rozbalovací nabídka (přetečení akcí) naznačuje úplně jiný koncept použití než jednoduché menu nastavení. Místo toho, abyste mysleli na nabídku jako na úložiště všech nastavení aplikace, vytvoříte panel, kam umístíte hlavní nastavení. Vše sekundární se vyjme v rozbalovací nabídce, která se vyvolá po kliknutí na tlačítko se třemi tečkami (tlačítko přetečení akce) na pravé straně panelu.

tlačítko přetečení akce

Pokud jste spouštěli aplikace napsané pro Android 2.3 a nižší na zařízeních bez tlačítek pod obrazovkou (například na tabletu s Honeycomb nebo na Galaxy Nexus), možná jste si všimli, že se vedle obrázku zobrazuje tlačítko Action overflow. tři tlačítka na panelu ve spodní části (tři tečky nad sebou). Toto je kompromis, ale ne příliš dobrý. V aplikacích, které menu nastavení vůbec nepoužívají, toto tlačítko nedělá nic, obtěžuje uživatele. Proto by bylo velmi dobrým řešením následovat verze pro Android a pokud váš program běží pod Androidem 3.0+, odeberte toto tlačítko z navigačního panelu a použijte panel akcí. Tento přístup vám umožňuje zachovat kompatibilitu programu se starými zařízeními a učinit jej atraktivnějším pro nová.

Pokud váš program běží na zařízeních bez tlačítek, systém rozhodne, zda přidat přetečení akce do navigační lišty v závislosti na hodnotě pole v manifestu. Logika je následující

  • Pokud nastavíte minSdkVersion nebo targetSdkVersion na hodnotu větší než 11, systém toto tlačítko nepřidá.
  • Na druhou stranu toto tlačítko systém vytvoří při spuštění aplikace na Androidu 3.0 a vyšším.
  • Jedinou výjimkou je, když nastavíte minSdkVersion na 10 nebo nižší; targetSdkVersion na 11, 12 nebo 13 a nebude používat ActionBar, systém toto tlačítko přidá na telefony (nikoli tablety) pod Ovládání Android 4.0 a vyšší. Tato výjimka je založena na následující myšlence: pokud vyvíjíte aplikaci pro telefony druhé větve a pro tablety třetí, pak předpokládáte, že telefony by měly mít tlačítko menu, ale tablety ne.

Pokud tedy chcete zakázat akci přetečení tlačítka v navigační liště, musíte nastavit targetSdkVersion na 14 (můžete napsat více než nízká hodnota aby program mohl běžet na starších zařízeních).

Přechod na koncept akčního panelu

Pokud máte aktivity, které používají nabídku možností (vytvořenou pomocí onCreateOptionsMenu()), pak odstraněním tlačítka z navigační lišty (nastavením targetSdkVersion=14) byste měli uživateli poskytnout alternativní způsob přístupu k možnostem. Naštěstí nemusíte dělat mnoho práce, protože systém automaticky vytvoří panel akcí.

Přidejte showAsAction="ifRoom" do svých značek prvky, které chcete vložit do panelu akcí. Pokud si nejste jisti, který prvek zahrnout do panelu akcí, podívejte se na průvodce panelem akcí v designu Android Design .

Aby bylo vnímání vašeho programu celistvější, doporučujeme vám použít ikony z Tým Android UX. Archiv .

Jak odstranit panel akcí z aplikace pro Android

Pokud panel akcí nepotřebujete, můžete jej odebrat z jakékoli aktivity nebo dokonce z aplikace. To může být relevantní pro hry a programy, které nepoužívají nabídku nastavení. Panel akcí můžete odstranit pomocí motivu Theme.Holo.NoActionBar nebo Theme.DeviceDefault.NoActionBar.

Pokud chcete použít tato schémata, ale ponechte zpětně kompatibilní, můžete použít systém správy zdrojů k nastavení různých témat různé verze platformy. Tomuto tématu se věnujeme podrobněji tady. Budete si muset vytvořit vlastní motiv, který bude dědit z motivů různé platformy v závislosti na aktuální verzi.

Můžete například deklarovat téma pro svou aplikaci

(nebo pro konkrétní aktivitu ve značce ).

Pro zařízení se systémem Android 2 zahrňte následující motiv do res/values/themes.xml.



Pro Honeycomb zahrňte následující motiv do res/values-v11/themes.xml.



Při spuštění, v závislosti na verzi API, systém vybere vhodné téma.

Závěr

Shrňme si hlavní myšlenky a body článku:

  • Na nový Android zařízení nemusí mít tlačítko "menu", takže při vývoji programů je lepší odmítnout jeho použití vůbec.
  • Nastavte targetSdkVersion = 14 a otestujte svou aplikaci na Androidu 4.0.
  • Přidejte značku showAsAction="ifRoom" do položku nabídky, pokud chcete, aby automaticky přešla na panel akcí.
  • Pokud vaše aplikace nepoužívá ActionBar, můžete jej odebrat pomocí motivů Theme.Holo.NoActionBar a Theme.DeviceDefault.NoActionBar.

Android podporuje několik typů nabídek. Za prvé – na telefonu je samostatné tlačítko Jídelní lístek(ve starších telefonech), stisknutím otevře nabídku. V nových zařízeních bylo odstraněno samostatné tlačítko a nahrazeno ikonou nabídky tři body ve vertikální orientaci. Druhým typem je kontextová nabídka, která se zobrazí po stisknutí a podržení prstu na obrazovce v správné místo(Můžete také stisknout a podržet středové tlačítko na telefonu). Kontextová nabídka zase může mít podnabídku. Dnes se seznámíme s prvním typem jídelníčku. Tento článek se bude zabývat prací s nabídkou na nových zařízeních se systémem Android 4.0 a vyšším.

V šabloně prázdná činnost není menu, tak si ho vytvoříme sami. To vám pomůže pochopit, jak to funguje, a získat obecnou představu o projektu. Pro manipulaci s výběrem položek nabídky není nutné pamatovat si názvy tříd, metod a kódů. V jiných šablonách bude nabídka zabudována a můžete ji hned používat.

Vytvořit nový projekt na základě prázdná činnost a spustit to. Menu zatím není.

Vytvořte více řetězcových zdrojů v souboru res/values/strings.xml, která bude zodpovědná za položky menu:

Nastavení Kočka Kočka Koťátko

Nyní vytvořte novou složku Jídelní lístek ve složce res res, | Nový | Adresář). Dále vytvořte soubor ve vytvořené složce menu_main.xml- název udává, že menu patří k hlavní činnosti Hlavní aktivita(klikněte pravým tlačítkem na složku Jídelní lístek | Nový | Nabídka Resource File). Pokud vytvoříte aplikaci s více obrazovkami, pak bude mít každá aktivita samostatnou nabídku s vlastním nastavením. Při otevírání souboru menu_main.xml a přidejte náš kód do výsledné šablony:

Otevřeme soubor Hlavní aktivita. V současné době má pouze jednu metodu. onCreate(). Přidejme novou metodu onCreateOptionsMenu(). Přesně tak tato metoda odpovídá za vzhled jídelníčku v činnosti. Vyberte si z nabídky studia Kód| a v dalším okně začněte psát název metody v prvních písmenech. Lze zadat jako první velká písmena, tj. ocom( Ó n C hodnotit Ó možnosti M enu), abyste rychle našli požadovaný řetězec. Stiskneme tlačítko OK a dostaneme obrobek.

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

Do přípravy přidáváme metodu, která bere data ze zdrojů nabídky a převádí je na položky nabídky na obrazovce.

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

V metodě nahustit() ukazujete na zdroj nabídky ( R.menu.menu_main) a objekt třídy Jídelní lístek.

V angličtině je „inflate“ přeloženo jako nafouknout, tzn. podle návrhu android vývojáři, trochu nafoukneme objekt daty, například menu. Ale ve skutečnosti slovo "nafouknout" pochází z fráze byt- do bytu. Starou tradicí je vypustit do bytu první kočku, která prozkoumá všechna zákoutí domu a vyjádří svůj souhlas s bydlením v něm. Spustíme tedy data z XML souboru do objektu MenuInflater.

Spusťte projekt. Nyní na pravé straně záhlaví uvidíte ikonu tří teček uspořádaných v svislá čára. Kliknutím na ikonu zobrazíte položku nabídky Nastavení.

Jak to není těžké uhodnout, prvek položka je zodpovědný za samostatnou položku menu. Stejným způsobem přidáme další tři položky a změníme pouze identifikátor a text nabídky:

Spusťte projekt a zkuste znovu vyvolat nabídku. Uvidíte tři nové položky.

Možnosti id a titul není třeba vysvětlovat. Parametr orderInCategory umožňuje nastavit vlastní pořadí zobrazení položek nabídky. Předpokládejme, že jste vytvořili pět položek nabídky, ale ještě jste se nerozhodli, v jakém pořadí se zobrazí na obrazovce. Aby se neustále nepřesouvaly celé bloky kódu pro položky nabídky správný příkaz, můžete použít tuto možnost.

A nakonec důležitý atribut app:showAsAction definuje chování nabídky v ActionBar. Význam nikdy znamená, že položka menu by se neměla zobrazovat v záhlaví, ale pouze ve vyskakovacím menu, tzn. být za třemi tečkami. Pokud nastavíte hodnotu vždy, pak bod Nastavení se okamžitě objeví v záhlaví vaší aplikace. Také dostupné hodnoty ifRooms, s textem a sbalitActionView. Zkus to sám. Například, ifRoom Zobrazí položku nabídky, pokud to místo dovolí. Pokud je bodů hodně, pak budou jen překážet. Tato volba zpravidla zobrazuje velmi krátké slovo nebo ikonu pro časté operace, aby se zabránilo zbytečnému klikání na tři tečky.

Všimněte si atributu app:showAsAction, který patří do jmenného prostoru xmlns:app="http://schemas.android.com/apk/res-auto". Bývaly doby, kdy takový jmenný prostor neexistoval a projekty tento atribut používaly android:showAsAction ze standardního jmenného prostoru. Pokud bude studio nadávat na chybu, upravte kód.

Dokud se neprovedou položky nabídky užitečná práce. Jakékoli kliknutí na položku jednoduše zavře nabídku bez viditelných následků. Dosud jsme nenapsali kód pro zpracování kliknutí.

Výběr položek nabídky

Naučili jsme se, jak vytvořit jídelníček. Zatím je to ale k ničemu, jelikož položky menu na naše kliknutí nijak nereagují. Další metoda se používá ke zpracování kliknutí v nabídce. onOptionsItemSelected(). Přidejme metodu stejným způsobem jako v předchozím příkladu. Pojďme na přípravu.

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

Parametr položka odpovědný za položku menu. Měli byste získat ID nabídky pomocí metody getItemId() a zadejte pro něj kód. Jelikož se menu obvykle skládá z více položek, je vhodné používat konstrukce pokud/jinak nebo přepínač. Pro zobrazení informací používáme textový popisek. Přidejte komponentu na obrazovku aktivity zobrazení textu. Můžete použít stávající zobrazení textu s nápisem "Ahoj světe!", stačí mu dát ID.

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

Přidejme kód do prázdného místa pro vybranou položku nabídky:

@Override public boolean onOptionsItemSelected(položka MenuItem) ( // Získání ID vybrané položky nabídky int id = item.getItemId(); TextView infoTextView = (TextView) findViewById(R.id.textView); // Operace pro vybrané položka menu switch ( id) ( case R.id.action_cat1: infoTextView.setText("Vybral jsi kočku!"); return true; case R.id.action_cat2: infoTextView.setText("Vybral jsi kočku!"); return true; case R. id.action_cat3: infoTextView.setText("Vybrali jste si kotě!"); return true; výchozí: return super.onOptionsItemSelected(item); ) )

Spusťte aplikaci, vyvolejte nabídku a vyberte libovolnou položku nabídky. V textovém poli by se měla objevit zpráva.

Existuje alternativní způsob přes XML podobně jako zpracování kliknutí na tlačítka (od Androidu 3.0). Můžete přidat atribut android:onclick ve zdrojích nabídky a nemusíte používat volání metody onOptionsItemSelected(). S pomocí android:onclick můžete určit požadovanou metodu při výběru položky nabídky. Přidejte tento atribut k položce Nastavení

Nyní do kódu aktivity napíšeme následující:

// atribut položky nabídky Nastavení je nastaven na android:onClick="onSettingsMenuClick" public void onSettingsMenuClick(položka MenuItem) ( TextView infoTextView = (TextView) findViewById(R.id.textView); infoTextView.setText("Vybrali jste Nastavení, lepší by bylo vybrat kočku");)

Přepínače

Vzhled položek nabídky lze změnit na zobrazení pomocí přepínačů. Chcete-li to provést, přidejte prvek skupina s atributem android:checkableBehavior="single":

V tomto režimu nevidím moc smysl. A nebudeme o tom uvažovat.

Režim návrhu

Android Studio 2.2 přidalo grafický režim pro vytváření nabídek, které vypadají jako panel nástrojů pro přidávání nových komponent na obrazovku. Panel nabídek se skládá ze čtyř prvků: Položka nabídky, Hledat položku, Jídelní lístek, skupina.

Princip je stejný, vyberte požadovaný prvek a přetáhněte jej na obrazovku do oblasti nabídky. Pokud jste se naučili ručně vytvářet menu, pak tato metoda nezpůsobí vám žádné potíže. S ním můžete rychle načrtnout strukturu nabídky a poté ji ručně vyladit.