a képzés első hónapja. Nézzük meg közelebbről a menüt. Mind a régi Android 2.3-as készülékeket, mind az új Android 4.0-s telefonokat figyelembe veszik.

Opciók menü

Az étlapért az osztály felelős android.view.Menu. Minden tevékenység egy menüobjektumhoz van társítva. Maga a menü menüpontokat tartalmaz (osztály android.view.MenuItem) és almenü (osztály android.view.SubMenu).

Amikor megnyom egy gombot Menü régebbi telefonokon menüelemek halmaza jelenik meg a tevékenységhez csatolva. A menü ikonokat tartalmazhat. Egy ilyen menü hat elemet tartalmazhat (szabály szerint). Hatnál több elem esetén a bővített menü kerül felhasználásra - ebben az esetben a hatodik elem helyett az elem jelenik meg Lehetőségek(több). Ha ezt az elemet megnyomja, egy kiterjesztett menü jelenik meg azon elemek listájával, amelyek nem fértek el az opciókiválasztó menü fő részébe.

A menü első megnyitásakor az Android meghívja a módszert onCreateOptionsMenu(), átad egy objektumot paraméterként Menü. A menüket erőforrásként hozhatjuk létre XML-fájlban, vagy használhatjuk a add().

Egy szabványos projektben egy normál sablon kiválasztásakor már van egy üres hely az egypontos menü számára Beállításokés egy módszerhívás a menühöz (erről már tudsz).

Menü létrehozása erőforrások felhasználásával

Fontolja meg a menü használatát az erőforrásokon keresztül. A menü létrehozásához erőforrásokat használnak, amelyeket XML-fájlban kell tárolni. Magának a fájlnak a mappában kell lennie res/menu/ a projekted. A menü a következőkből áll a következő elemeket:

Meghatározza a menüelemeket tartalmazó menüt. Elem a gyökérelemnek kell lennie a fájl XML-struktúrájában, és tartalmazhat egy vagy több elemet és Közvetlenül menüelemeket hoz létre. Ennek az elemnek lehet beágyazott eleme almenü létrehozásához Opcionálisan használhat láthatatlan elemtárolót is . Ez lehetővé teszi bizonyos hatások elérését

Tegyük fel, hogy úgy döntünk, hogy valamilyen játékhoz használjuk a menüt. Alkossunk új fájl game_menu.xml:

Készítettünk egy menüt két tételből. Minden elem a következő attribútumokat tartalmazza:

Android:id A menüpont azonosítója, amely alapján az alkalmazás felismeri, ha a felhasználó kiválasztja a menüpontot android:title A menüben megjelenő szöveg

Az elemhez más attribútumok is tartoznak tétel, például android:icon="@drawable/home" a menüelem ikonját is megjeleníti, és android:enabled="false" lehetővé teszi a menüpont elérhetetlenné tételét.

Tulajdonság android:titleCondensed akkor használatos, ha a szokásos cím túl széles ahhoz, hogy "elférjen" a kiválasztott menüpontban.

Tulajdonság android:orderInCategory meghatározza a MenuItems menüpontok megjelenítési sorrendjét.

A menü létrehozásakor a karakterlánc erőforrásokra mutattunk rá @string/new_gameés @string/help. Új sorokat kell hozzáadni a fájlhoz strings.xml:

Új játék Referencia

Most módosítanunk kell azt a tevékenységi osztályt, amelyben a menü megjelenik. A programnak az általunk létrehozott menüerőforrást programobjektummá kell alakítania. Erre a célra van egy speciális módszer. MenuInflater.inflate(), amelyet speciális módszerrel hívnak visszahív onCreateOptionsMenu(). Ezt a módszert úgy tervezték, hogy egy gomb megnyomásakor egy menüt jelenítsen meg. MENÜ az eszközön:

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

A kód beillesztése után a fejlesztői környezet kérni fogja a hiányzó névterek importálását.

Import android.view.Menu; import android.view.MenuInflater;

Módszer onCreateOptionsMenu() a metódus kezdeményezi a menü első megjelenését a képernyőn, és paraméterként egy Menu objektumot vesz (régebbi készülékeknél). Menthet egy hivatkozást a menüre, és bárhol használhatja a kódban, mindaddig, amíg a módszer onCreateOptionsMenu() nem hívják újra. Mindig ennek a kezelőnek a szülőosztályú implementációját érdemes használni, mert szükség esetén automatikusan további rendszerelemeket is tartalmaz a menüben. Az új eszközökben a metódus a tevékenység létrehozásakor kerül meghívásra. A metódusnak értéket kell visszaadnia igaz hogy a menü látható legyen a képernyőn.

A program elindítása után nyomja meg a gombot MENÜ az emulátoron a létrehozott menü megtekintéséhez.

Módszer getMenuInflater() az osztály egy példányát adja vissza menüfelfújó, amellyel a menüadatokat XML-ből olvassuk ki.

Mint látható, a menü a képernyő alján jelenik meg. Összesen hat menüpont jeleníthető meg egyszerre. Ha több pont van, akkor öt pont plusz a hatodik pont jelenik meg Több, amely lehetővé teszi a többi elem megtekintését. Teszteljük és adjunk hozzá új menüpontokat.

Először adjunk hozzá hat pontot.

Adjunk hozzá még egy elemet a menühöz, hogy hét legyen.

Menüpontok kiválasztása

Megtanultuk, hogyan kell menüt készíteni. De egyelőre hiába, hiszen a menüpontok semmilyen módon nem reagálnak a kattintásainkra. A módszer a menüelemekre történő kattintások kezelésére szolgál. onOptionsItemSelected(). A módszer felismeri a felhasználó által kiválasztott elemet keresztül Menü tétel. Most hívással tudjuk meghatározni a kiválasztott elemet getItemId(), amely a menüpont azonosítóját adja vissza. Tovább az operátoron keresztül kapcsoló nekünk kell meghatároznunk a szükséges parancsokat:

@Public logikai érték felülbírálása onOptionsItemSelected(MenuItem item) ( // Műveletek a kiválasztott menüelemhez kapcsoló (item.getItemId()) ( case R.id.new_game: newGame(); return true; case R.id.help: showHelp( ) ; return true; alapértelmezett: return super.onOptionsItemSelected(elem); ) ) public void newGame() ( edtext.setText("Új játék kiválasztva"); ) public void showHelp() ( edtext.setText("Súgó kiválasztva" ) ;)

Indítsa el az alkalmazást, hívja elő a menüt és válassza ki az első vagy a második menüpontot. Egy üzenetnek kell megjelennie a szövegmezőben.

A megadott példában getItemId() kér egy azonosítót a kiválasztott menüponthoz, és a kapcsolókiválasztási utasításon keresztül elkezdi összehasonlítani az általunk az XML erőforrásokban beállított azonosítókkal. A kívánt azonosító megtalálása után az adott menüponthoz tartozó kezelő lefut. Ha a program nem talál semmit, akkor az utasítás végrehajtásra kerül alapértelmezett, ami visszaadja a szuperosztályt.

Android 3.0 esetén hozzáadhatja az attribútumot android:onclick menüforrásokban, és már nem kell használnia onOptionsItemSelected(). Segítséggel android:onclick menüpont kiválasztásakor megadhatja a kívánt módszert.

// A menüelem attribútuma a következőre van állítva: android:onClick="onMenuClick" public void onMenuClick(MenuItem item)( edtext.setText("Etesd meg a kiválasztott macskát"); )

Menü létrehozása programozottan

Fontolgat szoftver készítés menü a teljesség érdekében. Meg kell határoznunk néhány állandót a menüelemekhez:

// menüelemek azonosítói private static final int IDM_OPEN = 101; privát statikus végső int IDM_MENTÉS = 102; public logikai érték aCreateOptionsMenu(Menu menu) ( // menüelemek hozzáadása menu.add(Menu.NONE, IDM_OPEN, Menu.NONE, "Open"); menu.add(Menu.NONE, IDM_SAVE, Menu.NONE, "Save") ;)

A módszernél add() négy lehetőség van:

  • csoportazonosító - lehetővé teszi egy menüpont társítását a menü többi elemének csoportjával
  • menüpont azonosítója a menüpont kiválasztásának eseménykezelőjéhez
  • az elem sorrendje a menüben - lehetővé teszi a menü pozíciójának meghatározását. Alapértelmezés szerint (Menu.NONE vagy 0) az elemek a kódban megadott sorrendben mennek
  • title - a menüpontban megjelenő szöveg. Használhat karakterlánc-erőforrást

A metódus egy objektumot ad vissza Menü tétel, amellyel további tulajdonságok állíthatók be, például ikon beállítása, gyorsbillentyű stb.

Ha szeretne menüt létrehozni ikonokkal, akkor használja a módszert setIcon()

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

Emlékezzünk vissza, hogy ikonok csak hat menüelemhez adhatók hozzá (vagy öthöz, ha hatnál több elem van).

Módszer aCreateOptionsMenu menüben a rendszer csak egyszer hívja meg a menü létrehozásakor. Ha a program futása közben frissítenie kell a menüt, használja a visszahívási módszert onPrepareOptionsMenu().

Amikor kiválasztunk egy menüpontot, a módszer meghívásra kerül onOptionsItemSelected, amely áthalad az objektumon Menü tétel- a felhasználó által kiválasztott menüpont. A módszer segítségével getItemId megkaphatja a kiválasztott menüpont azonosítóját. A menüpont azonosítása után kódot írhat a menüválasztási esemény kezelésére:

Nyilvános logikai érték onOptionsItemSelected(MenuItem item) ( switch (item.getItemId()) case IDM_OPEN: true return; case IDM_SAVE: true return; return false; )

Gyorsbillentyűk

Gyorsbillentyűket is beállíthat a gyors eléréshez a billentyűzet karaktereinek használatával, többféle módszerrel:

  • setAlphabeticShortcut(char) – karaktert ad hozzá
  • setNumericShortcut(int) – hozzáad egy számot
  • setShortcut(char, int) – karakter és szám kombinációját adja hozzá

Például, ha beállítja a setAlphabeticShortcut("q"); gyorsbillentyűt, akkor a menü megnyitásakor (vagy miközben lenyomva tartja a MENU gombot) nyomja meg a K kiválasztja ezt a menüpontot. Ez gyorsbillentyű(vagy billentyűparancs) elemleírásként jelenik meg a menüelem neve alatt. Az újabb billentyűzetek külön billentyűvel rendelkeznek ctrl, amely ugyanúgy működik, mint a hagyományos billentyűzeteken.

A gyorsbillentyűk XML-en keresztül is létrehozhatók: android:alphabeticShortcut="c".

A kattintásokat a tevékenységmódon keresztül kezelheti onKeyShortcut():

@Public logikai érték felülbírálása onKeyShortcut(int keyCode, KeyEvent esemény) ( kapcsoló (kulcskód) ( KeyEvent.KEYCODE_R kis- és nagybetű: Toast.makeText(this, "Reply", Toast.LENGTH_SHORT).show(); return true; alapértelmezett: return super. onKeyShortcut(kulcskód, esemény); ) )

Almenü létrehozása

Egy almenü bármely menühöz hozzáadható, kivéve egy másik almenüt. Az almenü visszahívási módszerrel jön létre onCreateOptionsMenu() módszer segítségével addSubMenu() amely visszaad egy tárgyat almenübe. Tiltakozni almenübe módszerrel további elemeket adhat hozzá ehhez a menühöz add(). Például:

Nyilvános statikus végső int IDM_HELP = 101; public static final int IDM_ÚJ = 201; public static final int IDM_OPEN = 202; public static final int IDM_SAVE = 203; public static final int IDM_CUT = 301; nyilvános statikus végső int IDM_COPY = 302; public static final int IDM_PASTE = 303; @Override public logikai onCreateOptionsMenu(Menu menu) ( SubMenu subMenuFile = menu.addSubMenu("Fájl"); subMenuFile.add(Menu.NONE, IDM_NEW, Menu.NONE, "New"); subMenuFile.add(Menu.NONE, IDM_OP , Menu.NONE, "Open"); subMenuFile.add(Menu.NONE, IDM_SAVE, Menu.NONE, "Save"); SubMenu subMenuEdit = menu.addSubMenu("Szerkesztés"); subMenuEdit.add(Menu.NONE, IDM_CUT , Menu.NONE, "Cut"); subMenuEdit.add(Menu.NONE, IDM_COPY, Menu.NONE, "Másolás"); subMenuEdit.add(Menu.NONE, IDM_PASTE, Menu.NONE, "Paste"); menü. add(Menu.NONE, IDM_HELP, Menu.NONE, "Súgó"); return super.onCreateOptionsMenu(menu); ) @Public boolean felülbírálása onOptionsItemSelected(MenuItem item) ( CharSequence üzenet; kapcsoló (item.getItemId()) ( case IDM_NEW : message = "Új elem kiválasztva"; break; case IDM_OPEN: message = "kijelölt tétel megnyitása"; break; case IDM_SAVE: message = "kijelölt tétel mentése"; break; case IDM_CUT: message = "kivágott elem"; break; case IDM_COPY:message= "Kijelölt elem másolása"; szünet; case IDM_PASTE: message = "Beillesztés kiválasztva"; szünet; case IDM_HELP: message = "Súgóelem kiválasztva"; szünet; alapértelmezett: return false; ) // értesítés megjelenítése a kiválasztott menüpontról Toast toast = Toast.makeText(this, message, Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER, 0, 0); pirítós.show(); return true; )

Most, amikor kiválasztunk egy menüpontot, egy másik ablak jelenik meg egy almenüvel. Próbáld ki magad.

Jelölőnégyzetek és rádiógombok hozzáadása

A menüelemekhez jelölőnégyzeteket vagy rádiógombokat adhat. Ha egy jelölőnégyzetet vagy rádiógombot szeretne hozzáadni egy adott menüponthoz, akkor ezt a módszert kell használnia setCheckable():

MenuItem item = menu.add(0, IDM_FORMAT_BOLD, 0, "Bold"); item.setCheckable(true);

Ha több jelölőnégyzetes vagy választógombos menüelemet kell hozzáadni, akkor ezeket külön azonosító létrehozásával menücsoportokba vonhatja össze. A menüpont a módszerrel kerül be a csoportba add(), első paraméterként átadva neki a menücsoport azonosítóját. Tegyük fel, hogy deklaráltunk azonosítókat a Szín menücsoporthoz és a menüelemekhez a szín beállításához:

Nyilvános statikus végső int IDM_COLOR_GROUP = 400; public static final int IDM_COLOR_RED = 401; public static final int IDM_SZÍN_ZÖLD = 402; nyilvános statikus végső int IDM_SZÍN_KÉK = 403;

Most egy jelölőnégyzetekkel rendelkező menücsoport létrehozásához hozzá kell rendelni egy csoportazonosítót minden menüponthoz, és meg kell hívni a metódust setGroupCheckable() az egész csoportra (ebben az esetben nem szükséges a metódus meghívása setCheckable() minden menüpontnál):

SubMenu subMenuColor = menu.addSubMenu("Szín"); subMenuColor.add(IDM_COLOR_GROUP, IDM_COLOR_RED, Menu.NONE, "Piros"); subMenuColor.add(IDM_COLOR_GROUP, IDM_COLOR_GREEN, Menu.NONE,"Zöld"); subMenuColor.add(IDM_COLOR_GROUP, IDM_COLOR_BLUE, Menu.NONE, "Kék"); subMenuColor.setGroupCheckable(IDM_COLOR_GROUP, igaz, hamis);

A módszernél setGroupCheckable() három lehetőség:

  • az első paraméter a menücsoport azonosítója;
  • a második paraméter igaz, ha rádiógombok vagy jelölőnégyzetek engedélyezettek a csoportban;
  • harmadik paraméter - a menüelemek egyszeri (igaz) vagy többszörös (hamis) kiválasztását állítja be. Ez a beállítás tulajdonképpen meghatározza a menü megjelenését – rádiógombokkal vagy jelölőnégyzetekkel ellátott menü lesz.

    A jelölőnégyzetek és választógombok állapotának szabályozásához a menüpont kiválasztási eseménykezelőjében írja be a következőket:

    @A nyilvános logikai érték felülbírálása onOptionsItemSelected(MenuItem item) ( CharSequence üzenet; kapcsoló (item.getItemId()) ( ... eset IDM_COLOR_RED: // megfordítja a jelölőnégyzet állapotát item.setChecked(!item.isChecked()); üzenet = "Piros szín"; törés; alapértelmezett: hamis visszatérés; )

    Futtassa a projektet, hívja elő a menüt és válassza ki a menüpontot Szín. Lesz egy almenüje három elemmel (piros, zöld, kék) zászlók formájában. A jelölőnégyzetek és kapcsolók állapota a programkódban kerül feldolgozásra, és a menü ismételt meghívásakor mentésre kerül.

    A setIntent() metódussal azonnal hozzárendelhet egy szándékot a kiválasztott menüelemhez, amely akkor aktiválódik, amikor erre az elemre kattintanak, ha ezt az eseményt az onMenuItemClickListener (elavult) vagy az onOptionsItemSelected kezelők nem kapták el. Az aktiválás után az intent a startActivity metódushoz kerül.

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

    Menü programozott megnyitása vagy bezárása

    Ha valamilyen oknál fogva programozottan kell megnyitnia a menüt (például demonstrációs célból), akkor használja a módszert openOptionsMenu():

    OpenOptionsMenu();

    A menü programozott bezárásához használja a módszert closeOptionsMenu(), azonban ismételten hívom a módszert openOptionsMenu() bezárja a menüt is.

    Menüpont programozott eltávolítása

    Tegyük fel, hogy definiáltunk egy menüelemet egy xml fájlban:

    Egy nyilvánvalóan szükségtelen menüpont eltávolításához a macska programunkból, a menüpontot a metóduson keresztül kell elérni item keresése()és láthatatlanná tegye. A Menü objektumra való hivatkozást át kell adni a metódusnak aCreateOptionsMenu menüben hogy a program megismerje az étlap összetételének változását.

    // osztály változó Menü menü; @Override public boolean onCreateOptionsMenu(Menu menu) ( super.onCreateOptionsMenu(menu); // hivatkozás átadása objektumunkra this.menu = menu; getMenuInflater().inflate(R.menu.test, menu); return true; ) / / gombra kattintás public void onClick(View v) ( if (menu != null) ( // keresse meg a kívánt elemet MenuItem item_dog = menu.findItem(R.id.action_dog); // láthatatlanná tegye item_dog.setVisible(false ) ) )

    De ezt a döntést Van egy hátránya, hogy ha elforgatjuk a képernyőt, akkor a tevékenység újra létrejön, és újra megjelenik a távoli menü. Hogyan szabadulhatunk meg a csúnya kutyától?

    Emlékeznünk kell a menüpont állapotára, és a metódusban egy Bundle típusú objektumban kell tárolnunk onSaveInstanceState, és a módszerben onCreate() lekérni a mentett állapotot és átadni a metódusnak a PrepareOptionsMenu menüben, amelyet azelőtt hívnak meg, hogy a menü megjelenik a képernyőn:

    Csomag en.alexanderklimov.test; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; public class A TestActivity kiterjeszti az aktivitást ( Menü menü; Logikai mentettMenuDogIsVisible; végleges statikus karakterlánc KEY_MENU_DOG = "KEY_MENU_DOG"; @A public void felülbírálása onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); setContent //activity. menüpont láthatósági adatai if (savedInstanceState != null) ( savedMenuDogIsVisible = savedInstanceState.getBoolean(KEY_MENU_DOG, true); ) ) @Override public boolean onCreateOptionsMenu(Menu menu) ( super.onCreateOptions get.menuter(menuter); .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 az item_dog.setVisible(false; ) ) menüpontot findItem(R.id.action_dog); // mentse el a menüpont aktuális állapotát - igaz vagy hamis outState putBoolean(KEY_MENU_DOG, item_dog.isVisible()); ) ) @Public logikai felülbírálása aPrepareOptionsMenu(Menü menü) ( if (savedMenuDogIsVisible != null) ( MenuItem item_dog = menu.findItem(R.id.action_dog); // mielőtt megjeleníti a menü kívánt állapotát item_dog.setVisible)(IsvedMenuDog) ; ) return super.onPrepareOptionsMenu(menü); ) )

    A Menü gomb jelenlétének észlelése

    A régebbi készülékek valódi Menü gombot használtak. Új verziókban android menü eltávolították az ActionBar-ból, és külön gombként való jelenléte opcionálissá vált. De sok gyártó még mindig menügombos telefonokat gyárt. Annak meghatározásához, hogy van-e ilyen gomb, hozzáadta az Android 14-et új módszer, amely meghatározza ennek a gombnak a jelenlétét.

    If(Build.VERSION.SDK_INT<= 10 || (Build.VERSION.SDK_INT >= 14 && ViewConfiguration.get(this) .hasPermanentMenuKey())) ( // a menü gomb jelen van Toast.makeText(this, "Menu Button is", Toast.LENGTH_LONG).show(); ) else ( // Nincs menü gomb Toast.makeText(ez, "Nincs menügomb", Toast.LENGTH_LONG).show(); )

    Jelölés a menühöz

    A modern eszközökben a menü a ActionBar. És testreszabhatja a menü elrendezését XML-en keresztül.

    Tegyük fel, hogy ezt a lehetőséget választotta:

    Attribútumban showAsAction ne használja az értéket soha, különben nem fogja látni a jelölést. Maga a jelölés az attribútumon keresztül van megadva actionLayout. Jelölő kód:

    Menü töredékekben

    Az étlap nem csak egy tevékenység, hanem egy töredék része is lehet. A működési elv gyakorlatilag ugyanaz. A töredéknek van egy megfelelő módszere.

    @Override public void onCreateOptionsMenu(Menü menü, MenuInflater felfújó) ( super.onCreateOptionsMenu(menü, felfújó); inflater.inflate(R.menu.fragment_crime_list, menu); )

    FragmentManager felelős a hívásért onCreateOptionsMenu() amikor a tevékenység visszahívást kap onCreateOptionsMenu() a rendszerből. Ezt egyértelműen meg kell mondania a menedzsernek FragmentManager hogy a töredéket meg kell hívni onCreateOptionsMenu(). Erre a módszert ún setHasOptionsMenu():

    // A @Override public void töredékkódban onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); setHasOptionsMenu(true); getActivity().setTitle(R.string.cat); ... )

A Honeycomb (Android 3.0) előtt minden Android-eszközön volt „menü” gomb a képernyő alatt. A fejlesztők saját belátásuk szerint használhatták, és sok alkalmazás felülete e gomb köré épült. A táblagép-orientált Honeycomb egy lépést tett a mechanikus (és érintő) gomboktól, és ebben a tekintetben a harmadik android verziók megjelent az ActionBar osztály, amely lehetővé tette a felhasználó számára gyors hozzáférés az alkalmazás beállításaihoz a műveletsávnak nevezett speciális panelen keresztül. Alapján Google Developers Az Action Bar a jövő, és a programozóknak fel kell hagyniuk a "menü" gombbal. A piacot jelenleg az okostelefonok uralják mechanikus ill érintőgombot a képernyő alatt, de az Ice Cream Sandwich megjelenésével a helyzet drámaian megváltozhat. Önnek, mint fejlesztőnek fontos, hogy előre felkészüljön az ilyen eszközök megjelenésére, és még ma használja az Action bar koncepciót.

Első pillantásra úgy tűnhet, hogy az Action Bar használata problémákat okoz az Android 2.x rendszerhez készült programok fejlesztésekor, amelyekben ez a sáv még nem került megvalósításra. Itt azonban nincs probléma. Senki sem tiltja, hogy továbbra is használja a "menü" gombot azokon az eszközökön, ahol ez jelen van, egy Action Bar hozzáadásához csak néhány sornyi kódot kell írnia.

Ha megpróbálnám egy mondatba sűríteni ezt a cikket, az a következő lenne: " Állítsa a targetSdkVersion értéket 14-re, és címkézze meg a showAsAction="ifRoom" elemet azoknál a menüelemeknél, amelyeket a műveletsoron meg kell jeleníteni".

A beállítások menü végleges elutasítása Androidban

Nem elég csak abbahagyni a „menü” gomb használatát, a koncepciót teljesen ki kell verni a fejünkből. Ne hozzon létre menüket, hanem közvetlenül a tevékenységeken belül hozza létre az összes szükséges gombot. Ha néhány művelet nem fér el a panelen, helyezze el őket egy további legördülő menübe (művelettúlcsordulás). A fenti képen egy műveletsor látható egy keresőgombbal és egy további menü a sáv jobb oldalán.

Ha az alkalmazásod erre készült régi verzió Android (ami hagyományosan menüt használ), majd Android 3 táblagépen elindítva a képernyő alján megjelenik egy panel, amely a második ág telefonjain létező három gombot emulálja.

A terminológia meglehetősen zavaros, de a legördülő menü (action overflow) egészen más használati koncepciót sugall, mint egy egyszerű beállítási menü. Ahelyett, hogy egy menüben gondolkodna az alkalmazás összes beállításának tárolójaként, hozzon létre egy panelt, ahol a fő beállításokat helyezi el. Minden másodlagos kikerül a legördülő menüből, amelyet akkor hívunk meg, ha a panel jobb oldalán lévő három ponttal rendelkező gombra kattintunk (Action overflow gomb).

akció túlcsordulás gomb

Ha Android 2.3-as vagy régebbi verzióra írt alkalmazásokat futtatott olyan eszközökön, amelyeken a képernyő alatt nincs gomb (például Honeycomb táblagépen vagy Galaxy Nexuson), akkor észrevehette, hogy egy Action overflow gomb jelenik meg a képernyő alatt három gomb az alsó panelen (három pont egymáson). Ez egy kompromisszum, de nem túl jó. Azokban az alkalmazásokban, amelyek egyáltalán nem használják a beállítások menüt, ez a gomb nem tesz semmit, bosszantja a felhasználókat. Ezért nagyon jó megoldás lenne követni android verzió, és ha a program Android 3.0+ alatt fut, távolítsa el ezt a gombot a navigációs sávról, és használja a Műveletsávot. Ez a megközelítés lehetővé teszi, hogy a program kompatibilis maradjon a régi eszközökkel, és vonzóbbá tegye az újak számára.

Ha a program gombok nélküli eszközökön fut, a rendszer a mező értékétől függően eldönti, hogy hozzáadja-e a művelettúlcsordulást a navigációs sávhoz. a manifesztben. A logika a következő

  • Ha a minSdkVersion vagy a targetSdkVersion értéket 11-nél nagyobb értékre állítja be, akkor a rendszer nem adja hozzá ezt a gombot.
  • Másrészt a rendszer létrehozza ezt a gombot, amikor az alkalmazást Android 3.0 és újabb rendszeren futtatja.
  • Az egyetlen kivétel az, ha a minSdkVersion értéket 10-re vagy alacsonyabbra állítja; targetSdkVersion 11-re, 12-re vagy 13-ra, és nem használja az ActionBar-t, a rendszer hozzáadja ezt a gombot telefonokon (nem táblagépeken) a Android vezérlés 4.0 és újabb. Ez a kivétel a következő elgondoláson alapul: ha a második ághoz tartozó telefonokhoz és a harmadik táblagépekhez fejlesztünk alkalmazást, akkor feltételezzük, hogy a telefonoknak rendelkezniük kell menügombbal, a táblagépeken viszont nincs.

Így ha egy gomb túlcsordulási műveletét szeretné letiltani a navigációs sávban, akkor a targetSdkVersion értékét 14-re kell állítani (többet is írhat, mint Alacsony érték hogy a program futhasson régebbi eszközökön).

Áttérés az akciósáv koncepciójára

Ha olyan tevékenységei vannak, amelyek az opciók menüt használják (az onCreateOptionsMenu() segítségével), akkor a navigációs sáv gombjának eltávolításával (a targetSdkVersion=14 beállításával) alternatív módot kell biztosítania a felhasználó számára a beállítások eléréséhez. Szerencsére nem kell sokat dolgoznia, mert a rendszer automatikusan létrehoz egy akciósávot.

Adja hozzá a showAsAction="ifRoom" elemet a címkéihez a műveletsorba helyezni kívánt elemeket. Ha nem biztos abban, hogy melyik elemet vegye fel a műveletsorba, tekintse meg az Android Design's Action Bar útmutatóját .

Annak érdekében, hogy programja holisztikusabb legyen, javasoljuk, hogy használja a következő ikonokat Android UX csapat. Archívum.

Az Action Bar eltávolítása az Android alkalmazásból

Ha nincs szüksége a Műveletsávra, eltávolíthatja bármely tevékenységből, vagy akár az alkalmazásból is. Ez azokra a játékokra és programokra vonatkozhat, amelyek nem használják a beállítások menüt. A műveletsort a Theme.Holo.NoActionBar vagy a Theme.DeviceDefault.NoActionBar téma segítségével távolíthatja el.

Ha használni szeretné ezeket a sémákat, de tartsa meg visszafelé kompatibilis, az erőforrás-kezelő rendszer segítségével különböző témákat állíthat be különböző verziók platformok. Ezzel a témával részletesebben foglalkozunk itt. Létre kell hoznia saját témáját, amely örökölni fogja a témákat különféle platformok az aktuális verziótól függően.

Például deklarálhat egy témát az alkalmazáshoz

(vagy egy adott tevékenységhez a címkében ).

Az Android 2 rendszert futtató eszközökön vegye fel a következő témát a res/values/themes.xml fájlba.



A Honeycomb esetében vegye fel a következő témát a res/values-v11/themes.xml fájlba.



Indításkor az API verziójától függően a rendszer kiválasztja a megfelelő témát.

Következtetés

Foglaljuk össze a cikk legfontosabb gondolatait és pontjait:

  • A új Android Előfordulhat, hogy az eszközökön nincs "menü" gomb, ezért a programok fejlesztésekor jobb, ha egyáltalán nem használjuk.
  • Állítsa be a targetSdkVersion = 14 értéket, és tesztelje alkalmazását Android 4.0 rendszeren.
  • Adja hozzá a showAsAction="ifRoom" címkét egy menüpontot, ha azt szeretné, hogy automatikusan a műveletsorra kerüljön.
  • Ha az alkalmazás nem használja az ActionBar-t, a Theme.Holo.NoActionBar és a Theme.DeviceDefault.NoActionBar témák segítségével eltávolíthatja.

Az Android többféle menüt támogat. Először is - van egy külön gomb a telefonon Menü(régebbi telefonokban), amelynek megnyomására megjelenik a menü. Az új készülékekben egy külön gombot eltávolítottak, helyette egy menüikon került be három pontok függőleges helyzetben. A második típus egy helyi menü, amely akkor jelenik meg, amikor megnyomja és lenyomva tartja az ujját a képernyőn jó helyen(Telefonod középső gombját is lenyomva tarthatod). Helyi menü viszont lehet egy almenüje. Ma az első típusú menüvel ismerkedünk meg. Ez a cikk az Android 4.0 vagy újabb rendszert futtató új eszközök menüjének használatáról szól.

Sablonban üres tevékenység menü nincs, ezért mi magunk készítjük el. Ez segít megérteni, hogyan működik, és általános képet kaphat a projektről. A menüpontok kiválasztásának kezeléséhez nem szükséges megjegyezni az osztályok, metódusok és kódok nevét. Más sablonokban a menü be lesz építve, és azonnal használható.

Teremt új projekt alapján üres tevékenységés futtasd. Még nincs menü.

Hozzon létre több karakterlánc-erőforrást egy fájlban res/values/strings.xml, amely az alábbi menüpontokért lesz felelős:

Beállítások Macska Macska Cica

Most hozzon létre egy új mappát menü mappában res res, | Új | Könyvtár). Ezután hozzon létre egy fájlt a létrehozott mappában menü_fő.xml- a név azt jelzi, hogy a menü a fő tevékenységhez tartozik Fő tevékenység(jobb klikk a mappára menü | Új | Menü Erőforrás fájl). Ha több képernyős alkalmazást hoz létre, akkor minden tevékenységhez külön menü tartozik saját beállításokkal. A fájl megnyitása közben menü_fő.xmlés add hozzá a kódunkat a kapott sablonhoz:

Nyissuk meg a fájlt Fő tevékenység. Jelenleg csak egy módszer létezik. onCreate(). Adjunk hozzá egy új módszert onCreateOptionsMenu(). Pontosan ez a módszer felelős az étlap megjelenéséért a tevékenységben. Válasszon a stúdió menüjéből Kód| és a következő ablakban kezdje el beírni a metódus nevét az első betűkkel. Elsőként lehet beírni nagybetűvel, azaz ocom( o n C mérték O lehetőségek M enu), hogy gyorsan megtalálja a kívánt karakterláncot. Megnyomjuk a gombot rendbenés megkapjuk a munkadarabot.

@A nyilvános logikai érték felülírása onCreateOptionsMenu(Menü menü) (vissza a super.onCreateOptionsMenu(menu); )

Az előkészítéshez olyan módszert adunk, amely a menüforrásokból adatokat vesz és a képernyőn megjelenő menüpontokká konvertálja.

@Override public logikai onCreateOptionsMenu(Menü menü) ( getMenuInflater().inflate(R.menu.menu_main, menu); return true; )

A módszerben felfújni() egy menüforrásra mutat ( R.menu.menu_main) és osztályobjektum Menü.

Az angolban az "inflate"-t úgy fordítják, hogy felfújja, i.e. tervezés szerint android fejlesztők, mintegy felfújunk egy objektumot adatokkal, például egy menüvel. De valójában a "felfúj" szó a kifejezésből származik lakás- a lakásba. Régi hagyomány, hogy az első macskát beengedik a lakásba, amely a ház minden zugát-zugát bejárja, és kinyilvánítja beleegyezését, hogy benne lakjon. Tehát az adatokat az XML fájlból a MenuInflater objektumba futtatjuk.

Futtassa a projektet. Most a fejléc jobb oldalán egy három pontból álló ikon látható függőleges vonal. Kattintson az ikonra a menüpont megtekintéséhez Beállítások.

Mivel nem nehéz kitalálni, az elem tétel külön menüpontért felelős. Ugyanígy adjunk hozzá három további elemet, csak a menü azonosítóját és szövegét módosítva:

Futtassa a projektet, és próbálja meg újra előhívni a menüt. Három új elemet fog látni.

Lehetőségek idés cím nem kell magyarázat. Paraméter orderInCategory lehetővé teszi a saját menüelemek megjelenítési sorrendjének beállítását. Tegyük fel, hogy létrehozott öt menüpontot, de még nem döntötte el, hogy milyen sorrendben jelenjenek meg a képernyőn. Annak érdekében, hogy ne mozgassa folyamatosan a menüelemek teljes kódblokkjait helyes sorrend, használhatja ezt a lehetőséget.

És végül egy fontos tulajdonság app:showAsAction Meghatározza a menü viselkedését ActionBar. Jelentése soha azt jelenti, hogy a menüpont ne a fejlécben jelenjen meg, hanem csak a felugró menüben, pl. legyen a három pont mögött. Ha beállítja az értéket mindig, majd pont Beállítások azonnal megjelenik az alkalmazás fejlécében. Szintén elérhető értékek ifRooms, szöveggelés collapseActionView. Próbáld ki magad. Például, ifRoom Menüpontot jelenít meg, ha a hely engedi. Ha sok a pont, akkor azok csak akadályoznak. Általában ez az opció egy nagyon rövid szót vagy ikont jelenít meg a gyakori műveletekhez, hogy elkerülje a három pontra történő szükségtelen kattintásokat.

Figyelje meg az attribútumot app:showAsAction, amely a névtérhez tartozik xmlns:app="http://schemas.android.com/apk/res-auto". Volt idő, amikor ilyen névtér nem létezett, és a projektek használták az attribútumot android:showAsAction a szabványos névtérből. Ha a stúdió esküdni fog a hibára, akkor szerkessze a kódot.

A menüpontok végrehajtásáig hasznos munka. Bármilyen kattintás az elemre egyszerűen bezárja a menüt látható következmények nélkül. Még nem írtuk meg a kódot a kattintások kezelésére.

Menüpontok kiválasztása

Megtanultuk, hogyan kell menüt készíteni. De egyelőre hiába, hiszen a menüpontok semmilyen módon nem reagálnak a kattintásainkra. Egy másik módszert használnak a menükattintások kezelésére. onOptionsItemSelected(). Adjunk hozzá egy metódust az előző példához hasonlóan. Lássuk az előkészületeket.

@A nyilvános logikai érték felülbírálása onOptionsItemSelected(MenuItem elem) ( visszatér super.onOptionsItemSelected(elem); )

Paraméter tétel menüpontért felelős. Meg kell kapnia a menü azonosítóját a metóduson keresztül getItemId()és írjon be egy kódot hozzá. Mivel az étlap általában több tételből áll, kényelmes a konstrukciók használata ha más vagy kapcsoló. Az információk megjelenítéséhez szöveges címkét használunk. Adjon hozzá egy összetevőt a tevékenység képernyőhöz szövegnézet. Használhatja a meglévőt szövegnézet"Hello World!" felirattal, csak adja meg az azonosítót.

android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!"/>

Adjuk hozzá a kódot a kiválasztott menüpont üres részéhez:

@Override public logikai onOptionsItemSelected(MenuItem item) ( // A kiválasztott menüpont azonosítójának lekérése int id = item.getItemId(); TextView infoTextView = (TextView) findViewById(R.id.textView); // Műveletek a kiválasztotthoz menüelem kapcsolója ( id) ( case R.id.action_cat1: infoTextView.setText("Macskát választottál!"); return true; case R.id.action_cat2: infoTextView.setText("Macskát választottál!"); return true; case R. id.action_cat3: infoTextView.setText("Cicát választottál!"); return true; alapértelmezett: return super.onOptionsItemSelected(item); ) )

Futtassa az alkalmazást, hívja elő a menüt, és válassza ki a kívánt menüpontot. Egy üzenetnek kell megjelennie a szövegmezőben.

Létezik alternatív módon XML-en keresztül, hasonlóan a gombkattintások kezeléséhez (Android 3.0 óta). Hozzáadhat attribútumot android:onclick menü erőforrásokban, és nem kell metódushívást használnia onOptionsItemSelected(). Segítséggel android:onclick menüpont kiválasztásakor megadhatja a kívánt módszert. Adja hozzá ezt az attribútumot az elemhez Beállítások

Most a tevékenység kódjába a következőket írjuk:

// a Beállítások menüelem attribútuma android:onClick="onSettingsMenuClick" public void onSettingsMenuClick(MenuItem item) ( TextView infoTextView = (TextView) findViewById(R.id.textView); infoTextView.setText("Ön kiválasztotta a Beállítások, jobb lenne, ha macskát választanék");)

Kapcsolók

A menüpontok megjelenése rádiógombokkal nézetre változtatható. Ehhez adjon hozzá egy elemet csoport attribútummal android:checkableBehavior="single":

Nem sok értelmét látom ennek a módnak. És nem fogjuk figyelembe venni.

Tervezési mód

Az Android Studio 2.2 grafikus módot adott a menük létrehozásához, amelyek úgy néznek ki, mint egy eszköztár, amellyel új összetevőket adhat hozzá a képernyőhöz. A menüsor négy elemből áll: Menü tétel, Elem keresése, Menü, csoport.

Az elv ugyanaz, válassza ki a kívánt elemet, és húzza a képernyőre a menü területére. Ha megtanult manuálisan menüt létrehozni, akkor ez a módszer nem okoz gondot. Segítségével gyorsan felvázolhatja a menüszerkezetet, majd manuálisan módosíthatja.