Háromféle menü van az Androidban: Popup, Contextual és Options.
Mindegyiknek van egy speciális használati esete és kódja, amely hozzá tartozik. A használatuk megismeréséhez olvassa el tovább.
Minden menünek tartalmaznia kell egy XML fájlt, amely meghatározza annak elrendezését. Ezek a menüopcióhoz társított címkék:
- Ez a menü tároló eleme (hasonló a LinearLayout-hoz)
- Ez egy elemet jelöl és be van ágyazva a menücímkébe. Ne feledje, hogy egy elem elem tartalmazhat egy
elemet egy almenü képviseletére
- Ez arra szolgál, hogy egy bizonyos tulajdonságot vagy funkciót jelöljön meg pár menüpontban (IE állapot / láthatóság)
Amint a fenti kódrészletből látható, minden menüelemhez különféle attribútumok társulnak. A főbbeket itt részletezem, de ha meg szeretné tudni, hogy mi mást adhat hozzá, menjen ide.
- id - Ez a menüben szereplő elem egyedi azonosítója. Ezzel megnézheti, hogy a felhasználó pontosan mely elemre kattintott
- ikon - Ha egy ikont szeretne megjeleníteni az adott menüponthoz
- title - Az adott menü menüjében megjelenő szöveg
- showAsAction - Ezt az attribútumot csak akkor szabad használni, ha egy olyan menüt használ egy tevékenységnél, amely alkalmazássávot használ (vagy ahogy arra utal, a műveletsávot is). Azt szabályozza, hogy ez az elem mikor és hogyan jelenjen meg műveletként az alkalmazássávon. Öt érték van: mindig, soha, ifRoom, withText és collapseActionView
android:showAsAction="always|never|ifRoom|withText|collapseActionView"
Ezen értékek jelentését a következő szakaszban részletezem.
Ezen felül hozzá kell adnia a tevékenységéhez a vonatkozó onCreate menü metódust.
//Options Menu @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.options_menu, menu); return super.onCreateOptionsMenu(menu); } //Context Menu @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.context, menu); }
Opciók menü
Ez a menü általában az alkalmazás tetején található, és abban olyan műveleteket kell elhelyeznie, amelyek hatással vannak az alkalmazás egészére. Ezek lehetnek az alkalmazás beállításai vagy egy keresőmező.
A fenti menüelrendezést használva a következő opciók menüt kapjuk:

Ahogy ígértük, nézzük át a showAsAction attribútumhoz adható értékeket:
- mindig - mindig megjelenik a műveletsávban
- soha - soha nem fog megjelenni, ezért elérhető lesz a túlcsordulás menüben
- ifRoom - csak akkor, ha elegendő hely van a műveletsávban, akkor megjelenik. Ne feledje, hogy a dokumentáció szerint korlátozva van, hogy hány ikon lehet a műveletsávon.
- A withText-tartalmazza az elem címét a műveletsávban
- collapseActionView - ha ehhez az elemhez társul egy műveletnézet, akkor összecsukhatóvá válik (az API 14-től és annál magasabb)
Ha megyünk előre, és megváltoztatjuk a menü utolsó elemét a showAsAction = "soha" értékre , a következőket kapjuk:

Kontextus menü
Ez a menü akkor jelenik meg, amikor a felhasználó hosszú kattintással végrehajtja az egyik felhasználói felület elemét. Az ebben a menüben található opciók befolyásolják, hogy a felhasználó milyen UI elemre kattintott. Gyakran használják ezt a típusú menüt listában vagy rács nézetben, ahol a felhasználó interakciója az egyes elemekkel egy adott művelethez vezethet.
Képzeljen el egy olyan forgatókönyvet, ahol van egy képpel ellátott alkalmazás, és több választási lehetőséget szeretne bemutatni a felhasználónak, amikor rákattint a képre.
A helyi menü kétféleképpen jelenhet meg:
- Lebegő menü
- Műveletsáv az alkalmazás tetején
Csak az első lehetőség használatát mutatjuk be, de a második lehetőségről itt olvashat bővebben.
A következő XML használatával:
És hozzáadjuk a következő kódot fő tevékenységünkhöz:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TYPE_OF_LAYOUT layout = (TYPE_OF_LAYOUT)findViewById(R.id.main_layout); registerForContextMenu(layout); }
A következőket kapjuk:

Felugró menü
A felugró menü egy olyan típusú menü, amely függőleges listában jeleníti meg az elemeket. Ez a lista ahhoz a nézethez van csatolva, amelyre a felhasználó rákattintott a menü meghívásához. Fontos szem előtt tartani, hogy a felugró menü kiválasztásakor nem kívánja, hogy a felhasználó választása befolyásolja a felhasználó előző megnyomott tartalmát.
Ugyanazt a menü XML elrendezést fogjuk használni, mint korábban, de a következő kódot kell hozzáadnunk a tevékenységünkhöz:
void showPopupMenu(View view) { PopupMenu popup = new PopupMenu(this, view); MenuInflater inflater = popup.getMenuInflater(); inflater.inflate(R.menu.actions, popup.getMenu()); popup.show(); }
Ugyanazt az eredményt kapjuk, mint az előző képernyőképet, de anélkül, hogy a felhasználónak hosszú kattintást kellene végrehajtania.
Ikonok a felugró menükben
Most már tudom, mire valószinűleg itt vagy: tudni akarod, hogyan adhatsz hozzá ikonokat a menükhöz .
Míg bemutatok egy példát erre, bölcs dolog megérteni, hogy ez egy olyan funkció, amely nem engedélyezett a felugró menükben, és váratlan viselkedést okozhat. Ezt úgy érheti el, hogy a reflexióval bekapcsolja a setForceShowIcon nevű zászlót .
//popup is an instance of PopupMenu try { Field[] fields = popup.getClass().getDeclaredFields(); for (Field field : fields) { if ("mPopup".equals(field.getName())) { field.setAccessible(true); Object menuPopupHelper = field.get(popup); Class classPopupHelper = Class.forName(menuPopupHelper .getClass().getName()); Method setForceIcons = classPopupHelper.getMethod( "setForceShowIcon", boolean.class); setForceIcons.invoke(menuPopupHelper, true); break; } } } catch (Throwable e) { e.printStackTrace(); }

Most megkarcoltam a felületet Android-menükkel, de remélhetőleg elegendő arra, hogy inspirálja Önt a mélyebb ásatáshoz.