Android App Development: Hvordan lage en Alternativer Menu

Så langt i våre Android UI byggeklosser tutorials vi har egentlig ikke sett på menyer, men selvfølgelig de er en viktig del av brukeropplevelsen av vår søknad. Les videre for å komme i gang med den første typen Android-menyen, alternativmenyen

Android UI gir tre grunnleggende menytyper:.


    Alternativmenyen er den som vises når du klikker på menyknappen på eldre Android-enheter, eller via handlingslinjen øverst på skjermen i nyere (Post 3.0). Alternativmenyen skal håndtere globale programhandlinger som fornuftig for hele programmet.
  1. Kontekstuelle Menyer vises når du lengter klikker på et element. Kontekstuelle menyer skal håndtere elementspesifikke handlinger. De er spesielt nyttig i Gridview eller Listview oppsett, hvor du viser brukeren en liste over elementer.
  2. Pop-up menyer vise en vertikal liste over elementer. Dette er bra for å gi muligheter for en andre del av en menykommando, snarere enn som et frittstående meny.

    I denne opplæringen, vil vi se på å skape en alternativmenyen via XML, og ved å legge til et menyelement programmatisk. Neste måned vil vi se på kontekstuelle menyer for individuelle elementer, og for grupper av elementer. Vi bruker koden fra forrige tutorial, på Gridview, og legge til en meny til det.

    Options Meny

    Det er best praksis å definere en meny og dens elementer som en XML-menyen ressurs Da blåses det i koden. Dette gjør det lettere å se menystrukturen, det betyr at du kan lett lage forskjellige versjoner av menyen for forskjellig maskinvare, og det skiller visuelle og atferdskoden.

    De viktige deler av menyen XML (for begge alternativene og kontekstuelle menyer) er:

    < menyen > - En beholder for menyelementer (< element > og < gruppe > elementer)., Som må være rotnoden av menyen XML-filen

    < element > . - Et menyelement (MENUITEM gang oppblåst i koden)

    < gruppe > - Lar deg kategorisere < element > s inn i grupper, men er ikke i seg selv synlig

    Her er et eksempel alternativer menyen for å lagre henhold res /meny /main_menu.xml:
    <. pre> < meny xmlns: android = "http://schemas.android.com/apk/res/android" > < element android: id = "+ id /bakgrunn" android: title = "@ streng /background_title" /> android: showAsAction = "aldri" og lt; element android: id = "+ id /toast" android: title = "@ streng /toast_title" /> android: showAsAction = "ifRoom" < /meny >

    id attributt vil la oss referere til dette menypunktet i koden senere; og tittelen attributt er elementets tekst tittel, som vil bli vist hvis det er noe ikon. showAsAction angir om handlingen vil bli vist av seg selv i handlingsfeltet, eller bare i "flere handlinger-menyen på høyre side av stolpen. Her vil én handling bli vist hvis det er plass, og den andre vil aldri bli vist. Se docs for flere attributter du kan angi for et menyelement

    Du må også legge strenger å res /verdier /strings.xml.

     < string name = "background_title "> Endre bakgrunnsfarge < /string > < string name =" toast_title "> Show toast melding < /string > 

    Når du har opprettet menyen, må du blåse den i koden for at det skal være vist under kjøring. Legg dette til GridViewTestActivity:

     public boolean onCreateOptionsMenu (Meny menyen) {MenuInflater inflater = getMenuInflater (); inflater.inflate (R.menu.main_menu, menyen); return true;} 

    kompilere og kjøre, og sjekke ut din alternativmenyen. Dette er Android 4.3 så det viser handlingsfeltet; i Android 2.3 eller lavere du vil treffe på menyknappen for å trekke opp menyen for alternativer, og det vil vises nederst på skjermen

    Teksten brukes på handlingsfeltet er ikke ideelt.; du ville være bedre å opprette og lagre et ikon i res /teikne og deretter legge dette attributtet til menyvalget:

     android: icon = "@ teikne /toast_icon.png" 
    Håndtering meny klikk

    I dag skjer det ikke noe når brukeren klikker menyelementene. Vi trenger å skrive en metode for å håndtere klikk:

     public boolean onOptionsItemSelected (MENUITEM element) {switch (item.getItemId ()) {case R.id.background: changeBackground (); return true; case R.id.toast: Toast.makeText (getBaseContext (), R.string.toast_message, Toast.LENGTH_LONG) .vis (); return true; Standard: returnere super.onOptionsItemSelected (element); }} Private void changeBackground () {gridview.setBackgroundColor (Color.CYAN);} 

    Alt vi trenger er en bryter uttalelse, som ser på elementet ID for å avgjøre hvilke tiltak som skal gjøre. Merk at standard er å passere opp til superklassen. Dette er spesielt nyttig hvis du vil ha noen menyelementer i flere aktiviteter i en enkel app. Du kan skrive en superklasse som bare skaper en enkel meny, og deretter arve fra den superklasse for å få de samme metoder i alle dine aktiviteter.

    Compile og kjøre denne, og du vil være i stand til å se en melding eller endre bakgrunnsfargen. En fin forbedring ville være å gi brukeren et utvalg av forskjellige bakgrunnsfarger.



    Legge til et menypunkt i koden

    Selv om mesteparten av tiden er det best å skrive din menyelementer i XML, noen ganger må du være i stand til å legge til et menyelement programma - for eksempel et menyelement som dukker opp bare under visse omstendigheter, eller hvilke endringer. Først, la oss se på å endre en menyelement basert på ukedag:

     public class GridViewTestActivity strekker Aktivitet {private Meny meny; int backgroundColour; public boolean onCreateOptionsMenu (Meny menyen) {this.menu = meny; . getMenuInflater () blåse (R.menu.main_menu, menyen); setBackgroundItem (); return true; } Public boolean onOptionsItemSelected (MENUITEM element) {//som før saken R.id.background: changeBackground (backgroundColour); return true; //Hvile som før} private void setBackgroundItem () {Calendar cal = Calendar.getInstance (); int dag = cal.get (Calendar.DAY_OF_WEEK); if (dag == Calendar.SUNDAY) {backgroundColour = Color.MAGENTA; MENUITEM element = menu.findItem (R.id.background); item.setTitle ("Endre bakgrunnsfarge til magenta"); } Else {backgroundColour = Color.CYAN; }} Private void changeBackground (int farge) {gridview.setBackgroundColor (farge); }} 

    Mye av dette er den samme koden som før, bare refactored litt (vi trenger menyen og bakgrunnsfargen som klassevariabler). Den viktigste endringen er insetBackgroundItem (), som kontrollerer den dag i uken, og hvis det er en søndag, griper bakgrunnsfarge menyvalget bruker sin ID, og ​​endrer tittelen withitem.setTitle ().


    Legge til en hel meny element er også ganske grei

     public class GridViewTestActivity strekker Aktivitet {private static final int NEW_MESSAGE = 0; public boolean onCreateOptionsMenu (Meny menyen) {//legge denne linjen: addNewItem (); } Public boolean onOptionsItemSelected (MENUITEM element) {switch (item.getItemId ()) {//resten av bryter uttalelse som før saken NEW_MESSAGE: Toast.makeText (getBaseContext (), R.string.new_message, Toast.LENGTH_LONG) .vis ( ); //Hvile som før} private void addNewItem () {menu.add (0, NEW_MESSAGE, 0, R.string.new_message_title); }} 

    Det første argumentet til menu.add () er den gruppen ID; vi har ingen grupper på denne menyen så dette er null. Den andre er elementet ID, definert på toppen av klassen. Den tredje er rekkefølgen, bruker vi 0 som vi ikke bryr oss om bestillingen. Til slutt gir vi tittelen. Og det er vår nye menyvalget opprettet. Husk å legge en sak til onOptionsItemSelected () slik at den nye menyen er korrekt håndtert.

    kompilere og kjøre, og du vil se den nye meldingen vises. Merk imidlertid at selv om en dynamisk lagt menyvalget er noen ganger riktig, kan det være bedre å skape menypunktet i XML som med de andre, og deretter bruke denne linjen:

     item.setVisible (false); 

    for å sette sin synlighet basert på kode forhold, akkurat som vi endret tittelen på bakgrunnsfargen menyvalget i koden

    Vi har dekket det grunnleggende alternativmenyer.; sjekk ut neste måneds tutorial for mer om kontekstuelle menyer og gruppebehandling av elementer i en liste.