pirmąjį treniruočių mėnesį. Pažvelkime atidžiau į meniu. Bus svarstomi ir seni Android 2.3 įrenginiai, ir nauji Android 4.0 telefonai.

Parinkčių meniu

Už valgiaraštį atsakinga klasė android.view.Meniu. Kiekviena veikla susieta su vienu meniu objektu. Pačiame meniu yra meniu elementai (klasė android.view.MenuItem) ir submeniu (klasė android.view.SubMenu).

Kai paspausite mygtuką Meniu senesniuose telefonuose prie veiklos pridedamas meniu elementų rinkinys. Meniu gali būti piktogramų. Tokiame meniu gali būti šeši elementai (paprastai). Jei yra daugiau nei šeši elementai, naudojamas išplėstinis meniu – tokiu atveju vietoj šeštojo elemento pasirodo elementas Galimybės(daugiau). Paspaudus šį elementą, rodomas išplėstinis meniu su elementų, kurie netilpo pagrindinėje parinkčių pasirinkimo meniu dalyje, sąrašu.

Kai meniu atidaromas pirmą kartą, „Android“ iškviečia metodą onCreateOptionsMenu(), perduodant objektą kaip parametrą Meniu. Meniu gali būti kuriami kaip ištekliai XML faile arba galite naudoti papildyti().

Standartiniame projekte, renkantis įprastą šabloną, jau yra tuščia vieno taško meniu Nustatymai ir metodo iškvietimas meniu (tu jau žinote apie tai).

Meniu kūrimas naudojant išteklius

Apsvarstykite galimybę dirbti su meniu per išteklius. Norėdami sukurti meniu, naudojami ištekliai, kurie turi būti saugomi XML faile. Pats failas turi būti aplanke res/menu/ jūsų projektas. Meniu susideda iš toliau nurodytus elementus:

Nurodo meniu, kuriame bus meniu elementai. Elementas turi būti failo XML struktūros šakninis elementas ir gali turėti vieną ar daugiau elementų ir Tiesiogiai sukuria meniu elementus. Šis elementas gali turėti įdėtą elementą norėdami sukurti submeniu Pasirinktinai taip pat galite naudoti nematomų elementų konteinerį . Tai leidžia pasiekti tam tikrų efektų

Tarkime, nusprendžiame kokiam nors žaidimui naudoti meniu. Kurkime naujas failas game_menu.xml:

Sukūrėme meniu su dviem elementais. Kiekvienas elementas turi šiuos atributus:

Android:id Meniu elemento identifikatorius, pagal kurį programa gali atpažinti, kai vartotojas pasirenka meniu elementą android:title Tekstas, kuris bus rodomas meniu

Yra ir kitų elemento atributų daiktas, pavyzdžiui android:icon="@drawable/home" taip pat bus rodoma meniu elemento piktograma ir android:enabled="false" leidžia padaryti meniu elementą nepasiekiamą.

Atributas android:titleCondensed naudojamas, kai įprastas pavadinimas yra per platus, kad „tilptų“ į pasirinktą meniu elementą.

Atributas android:orderInCategory apibrėžia MenuItems meniu elementų rodymo tvarką.

Kurdami meniu nurodėme eilučių išteklius @string/new_game ir @string/help. Į failą reikia pridėti naujų eilučių strings.xml:

Naujas žaidimas Nuoroda

Dabar turime pakeisti veiklos klasę, kurioje bus rodomas meniu. Programa turėtų konvertuoti mūsų sukurtą meniu šaltinį į programos objektą. Tam yra specialus metodas. MeniuInflater.inflate(), kuris vadinamas specialiu metodu perskambink onCreateOptionsMenu(). Šis metodas skirtas meniu rodyti paspaudus mygtuką. MENIUįrenginyje:

@Nepaisyti viešosios loginės reikšmės onCreateOptionsMenu( meniu meniu) ( MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.game_menu, menu); return true; )

Įklijavus kodą, kūrimo aplinka paprašys importuoti trūkstamas vardų sritis.

Importuoti android.view.Menu; importuoti android.view.MenuInflater;

Metodas onCreateOptionsMenu() metodas inicijuoja pirmąjį meniu pasirodymą ekrane ir kaip parametrą paima meniu objektą (senesniems įrenginiams). Galite išsaugoti nuorodą į meniu ir naudoti ją bet kurioje kodo vietoje, kol metodas onCreateOptionsMenu() daugiau neskambins. Visada turėtumėte naudoti šios tvarkyklės pirminės klasės įgyvendinimą, nes prireikus ji automatiškai įtraukia papildomus sistemos elementus į meniu. Naujuose įrenginiuose metodas iškviečiamas, kai sukuriama veikla. Metodas turi grąžinti reikšmę tiesa kad meniu būtų matomas ekrane.

Paleidę programą paspauskite mygtuką MENIU emuliatoriuje, kad pamatytumėte sukurtą meniu.

Metodas getMenuInflater() grąžina klasės egzempliorių meniu pripūtęs, kurį naudojame meniu duomenims nuskaityti iš XML.

Kaip matote, meniu pasirodo ekrano apačioje. Iš viso vienu metu gali būti rodomi šeši meniu elementai. Jei yra daugiau taškų, bus rodomi penki taškai plius šeštas taškas Daugiau, kuri leis matyti likusius elementus. Išbandykime ir pridėkime naujų meniu elementų.

Pirmiausia pridėkime šešis taškus.

Į meniu įtraukime dar vieną elementą, kad jų būtų septyni.

Meniu elementų pasirinkimas

Išmokome sudaryti meniu. Tačiau kol kas tai nenaudinga, nes meniu elementai niekaip nereaguoja į mūsų paspaudimus. Šis metodas naudojamas meniu elementų paspaudimams valdyti. onOptionsItemSelected(). Metodas atpažįsta vartotojo pasirinktą elementą per Meniu elementas. Dabar išsirinktą prekę galime nustatyti paskambinę getItemId(), kuris grąžina meniu elemento ID. Toliau per operatorių jungiklis mums belieka apibrėžti reikiamas komandas:

@Nepaisyti viešosios loginės reikšmės onOptionsItemSelected(MenuItem item) ( // Pasirinkto meniu elemento jungiklio operacijos (item.getItemId()) ( atvejis R.id.new_game: newGame(); grįžti true; atvejis R.id.help: showHelp( ) ; return true; default: return super.onOptionsItemSelected(item); ) ) public void newGame() ( edtext.setText("pasirinktas naujas žaidimas"); ) public void showHelp() ( edtext.setText("Pasirinkta pagalba") ;)

Paleiskite programą, iškvieskite meniu ir pasirinkite pirmąjį arba antrąjį meniu elementą. Teksto laukelyje turėtų pasirodyti pranešimas.

Pateiktame pavyzdyje getItemId() prašo įvesti pasirinkto meniu elemento ID ir per jungiklio pasirinkimo sakinį pradeda lyginti su ID, kuriuos nustatėme XML šaltiniuose. Kai randamas reikiamas identifikatorius, vykdomas nurodyto meniu elemento tvarkytuvas. Jei programa nieko neranda, tada pareiškimas vykdomas numatytas, kuris grąžina super klasę.

3.0 versijos „Android“ galite pridėti atributą android:onclick meniu šaltiniuose ir jums nebereikia naudoti onOptionsItemSelected(). Su pagalba android:onclick pasirinkdami meniu elementą galite nurodyti norimą metodą.

// meniu elemento atributas nustatytas į android:onClick="onMenuClick" public void onMenuClick(MenuItem item)( edtext.setText("Pamaitinti pasirinktą katę"); )

Meniu kūrimas programiškai

Apsvarstykite programinės įrangos kūrimas meniu išsamumui. Turėsime apibrėžti keletą meniu elementų konstantų:

// meniu elementų identifikatoriai private static final int IDM_OPEN = 101; privatus statinis galutinis int IDM_SAVE = 102; public loginis onCreateOptionsMenu(Menu menu) ( // pridėti meniu elementus menu.add(Menu.NONE, IDM_OPEN, Menu.NONE, "Open"); menu.add(Menu.NONE, IDM_SAVE, Menu.NONE, "Išsaugoti") ;)

Prie metodo papildyti() yra keturi variantai:

  • grupės identifikatorius – leidžia susieti meniu elementą su kitų šio meniu elementų grupe
  • elemento identifikatorius, skirtas meniu elementų pasirinkimo įvykių tvarkyklei
  • elemento tvarka meniu – leidžia nustatyti poziciją meniu. Pagal numatytuosius nustatymus (Menu.NONE arba 0) elementai eina tokia tvarka, kokia nurodyta kode
  • pavadinimas – tekstas, kuris rodomas meniu elemente. Galite naudoti eilutės išteklius

Metodas grąžina objektą Meniu elementas, kurį galima naudoti norint nustatyti papildomas ypatybes, pvz., nustatyti piktogramą, sparčiąjį klavišą ir kt.

Jei norite sukurti meniu su piktogramomis, naudokite šį metodą setIcon()

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

Dar kartą prisiminkite, kad piktogramas galima pridėti tik prie šešių meniu elementų (arba penkių, jei yra daugiau nei šeši elementai).

Metodas meniu „CreateOptionsMenu“. sistema iškviečia tik vieną kartą, kai sukuriamas meniu. Jei reikia atnaujinti meniu, kai programa veikia, naudokite atgalinio skambinimo metodą onPrepareOptionsMenu().

Kai pasirenkamas meniu elementas, iškviečiamas metodas onOptionsItemSelected, kuris praeina pro objektą Meniu elementas- vartotojo pasirinktas meniu elementas. Naudojant metodą getItemId galite gauti pasirinkto meniu elemento ID. Identifikavę meniu elementą, galite parašyti kodą meniu pasirinkimo įvykiui valdyti:

Viešas loginis onOptionsItemSelected(MenuItem elementas) (perjungti (item.getItemId()) atvejis IDM_OPEN: grąžinti teisingą; atvejis IDM_SAVE: grąžinti teisingą; grąžinti klaidingą; )

Spartieji klavišai

Taip pat galite nustatyti sparčiuosius klavišus, kad galėtumėte greitai pasiekti naudodami klaviatūros simbolius keliais būdais:

  • setAlphabeticShortcut(char) – prideda simbolį
  • setNumericShortcut(int) – prideda skaičių
  • setShortcut(char, int) – prideda simbolio ir skaičiaus derinį

Pavyzdžiui, jei nustatote spartųjį klavišą setAlphabeticShortcut("q");, tada atidarę meniu (arba laikydami nuspaudę MENU klavišą), paspauskite klavišą K pasirenka šį meniu elementą. Tai karštasis klavišas(arba spartusis klavišas) bus rodomas kaip patarimas, rodomas po meniu elemento pavadinimu. Naujesnėse klaviatūrose yra atskiras klavišas ctrl, kuris veikia taip pat, kaip ir įprastose klaviatūrose.

Spartieji klavišai taip pat gali būti sukurti naudojant XML: android:alphabeticShortcut="c".

Spustelėjimus galite tvarkyti naudodami veiklos metodą onKeyShortcut():

@Nepaisyti viešosios loginės reikšmės onKeyShortcut(int keyCode, KeyEvent įvykis) ( jungiklis (keyCode) (atvejis KeyEvent.KEYCODE_R: Toast.makeText(this, "Reply", Toast.LENGTH_SHORT).show(); grįžti true; numatytasis: grįžti super. onKeyShortcut(rakto kodas, įvykis); ) )

Submeniu kūrimas

Submeniu gali būti įtrauktas į bet kurį meniu, išskyrus kitą submeniu. Submeniu sukuriamas atgalinio skambinimo metodu onCreateOptionsMenu() naudojant metodą addSubMenu() kuri grąžina objektą submeniu. Prieštarauti submeniu galite pridėti papildomų elementų į šį meniu naudodami metodą papildyti(). Pavyzdžiui:

Viešas statinis galutinis int IDM_HELP = 101; viešas statinis galutinis int IDM_NEW = 201; viešas statinis galutinis int IDM_OPEN = 202; viešas statinis galutinis int IDM_SAVE = 203; viešas statinis galutinis int IDM_CUT = 301; viešas statinis galutinis int IDM_COPY = 302; viešas statinis galutinis int IDM_PASTE = 303; @Nepaisyti viešosios loginės reikšmės onCreateOptionsMenu(Meniu meniu) ( SubMenu subMenuFile = menu.addSubMenu("Failas"); subMenuFile.add(Menu.NONE, IDM_NEW, Menu.NONE, "New"); subMenuFile.add(Menu.NONE, IDM_OP , Menu.NONE, "Atidaryti"); subMenuFile.add(Menu.NONE, IDM_SAVE, Menu.NONE, "Išsaugoti"); SubMenu subMenuEdit = menu.addSubMenu("Redaguoti"); subMenuEdit.add(Menu.NONE, IDM_CUT , Menu.NONE, "Iškirpti"); subMenuEdit.add(Menu.NONE, IDM_COPY, Menu.NONE, "Copy"); subMenuEdit.add(Menu.NONE, IDM_PASTE, Menu.NONE, "Įklijuoti"); meniu. add(Menu.NONE, IDM_HELP, Menu.NONE, "Help"); return super.onCreateOptionsMenu(menu); ) @Nepaisyti viešosios loginės reikšmės onOptionsItemSelected(MenuItem item) ( CharSequence pranešimas; jungiklis (item.getItemId()) ( atvejis IDM_NEW : message = "Pasirinktas naujas elementas"; pertrauka; atvejis IDM_OPEN: message = "Atidaryti pasirinktą elementą"; pertrauka; atvejis IDM_SAVE: message = "Išsaugoti pasirinktą elementą"; pertrauka; atvejis IDM_CUT: message = "Iškirpti pasirinktą elementą"; pertrauka; atvejis IDM_COPY:message= „Kopijuoti pasirinktą elementą“; pertrauka; case IDM_PASTE: message = "Įklijuoti pasirinkta"; pertrauka; case IDM_HELP: message = "Pasirinktas pagalbos elementas"; pertrauka; numatytasis: return false; ) // rodyti pranešimą apie pasirinktą meniu elementą Toast toast = Toast.makeText(this, message, Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER, 0, 0); tostas.show(); grįžti tiesa; )

Dabar, kai pasirenkate meniu elementą, pasirodys kitas langas su submeniu. Išbandykite patys.

Žymimųjų langelių ir radijo mygtukų pridėjimas

Prie meniu elementų galite pridėti žymimuosius laukelius arba radijo mygtukus. Norėdami pridėti žymimąjį laukelį arba radijo mygtuką prie atskiro meniu elemento, turite naudoti šį metodą setCheckable():

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

Jei reikia pridėti kelis meniu elementus su žymimaisiais laukeliais ar akutėmis, tuomet galite juos sujungti į meniu grupes sukurdami atskirą identifikatorių. Meniu elementas įtraukiamas į grupę naudojant metodą papildyti(), perduodamas meniu grupės ID kaip pirmąjį parametrą. Tarkime, kad paskelbėme meniu grupės Spalvos ID ir meniu elementus, kad nustatytų spalvą:

Viešas statinis galutinis int IDM_COLOR_GROUP = 400; viešas statinis galutinis int IDM_COLOR_RED = 401; viešas statinis galutinis int IDM_COLOR_GREEN = 402; viešas statinis galutinis int IDM_COLOR_BLUE = 403;

Dabar norėdami sukurti meniu grupę su žymimaisiais laukeliais, kiekvienam meniu elementui turite priskirti grupės ID ir iškviesti metodą setGroupCheckable() visai grupei (šiuo atveju metodo skambinti nereikia setCheckable() kiekvienam meniu elementui):

SubMenu subMenuColor = meniu.addSubMenu("Spalva"); subMenuColor.add(IDM_COLOR_GROUP, IDM_COLOR_RED, Menu.NONE, "Raudona"); subMenuColor.add(IDM_COLOR_GROUP, IDM_COLOR_GREEN, Menu.NONE,"Žalia"); subMenuColor.add(IDM_COLOR_GROUP, IDM_COLOR_BLUE, Menu.NONE, "Mėlyna"); subMenuColor.setGroupCheckable(IDM_COLOR_GROUP, true, false);

Prie metodo setGroupCheckable() trys variantai:

  • pirmasis parametras yra meniu grupės ID;
  • antrasis parametras yra teisingas, jei grupėje leidžiami radijo mygtukai arba žymės langeliai;
  • trečiasis parametras – nustato vieną (tiesa) arba kelis (klaidingus) meniu elementų pasirinkimą. Šis nustatymas iš tikrųjų lemia meniu išvaizdą – tai bus meniu su radijo mygtukais arba žymimaisiais langeliais.

    Norėdami valdyti žymimųjų laukelių ir radijo mygtukų būseną meniu elementų pasirinkimo įvykių tvarkyklėje, parašykite:

    @Nepaisyti viešosios loginės vertės onOptionsItemSelected(MenuItem elementas) ( CharSequence pranešimas; jungiklis (item.getItemId()) ( ... atvejis IDM_COLOR_RED: // invertuoti žymės langelio būseną item.setChecked(!item.isChecked()); pranešimas = "Raudona spalva"; pertrauka; numatytoji: grąžinti klaidingą; )

    Vykdykite projektą, iškvieskite meniu ir pasirinkite meniu elementą Spalva. Turėsite submeniu su trimis elementais (raudona, žalia, mėlyna) vėliavėlių pavidalu. Žymimųjų langelių ir jungiklių būsena apdorojama programos kode ir išsaugoma, kai vėl iškviečiamas meniu.

    Galite iš karto priskirti ketinimą pasirinktam meniu elementui naudodami setIntent() metodą, kuris suaktyvinamas spustelėjus šį elementą, jei šio įvykio neužfiksavo onMenuItemClickListener (nebenaudojama) arba onOptionsItemSelected tvarkyklės. Suaktyvinus ketinimą, jis perduodamas metodui startActivity.

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

    Programiškai atidaromas arba uždaromas meniu

    Jei dėl kokių nors priežasčių jums reikia programiškai atidaryti meniu (pavyzdžiui, demonstravimo tikslais), naudokite šį metodą openOptionsMenu():

    OpenOptionsMenu();

    Norėdami programiškai uždaryti meniu, naudokite metodą UždarytiOptionsMenu(), tačiau aš kartoju metodą openOptionsMenu() taip pat uždaro meniu.

    Programiškai pašalinamas meniu elementas

    Tarkime, kad apibrėžėme meniu elementą xml faile:

    Norėdami pašalinti akivaizdžiai nereikalingą meniu elementą iš mūsų kačių programos, turime pasiekti meniu elementą naudodami metodą rasti elementą () ir padaryti jį nematomu. Metodui turi būti perduota nuoroda į meniu objektą meniu „CreateOptionsMenu“. kad programa sužinotų apie meniu sudėties pasikeitimą.

    // klasės kintamasis Meniu meniu; @Nepaisyti viešosios loginės reikšmės onCreateOptionsMenu(Menu menu) ( super.onCreateOptionsMenu(menu); // perduokite nuorodą į mūsų objektą this.menu = meniu; getMenuInflater().inflate(R.menu.test, menu); return true; ) / / mygtuką spustelėkite viešą void onSpustelėkite (View v) ( if (meniu != null) ( // suraskite norimą elementą MenuItem item_dog = menu.findItem(R.id.action_dog); // padarykite jį nematomu item_dog.setVisible(false ;)))

    Bet šį sprendimą yra trūkumas, jei pasuksime ekraną, veikla bus atkurta ir vėl atsiras nuotolinis meniu. Kaip mes galime atsikratyti bjauraus šuns?

    Turime atsiminti meniu elemento būseną ir išsaugoti jį metodo Bundle tipo objekte onSaveInstanceState, ir metodu onCreate () gauti išsaugotą būseną ir pereiti prie metodo meniu PrepareOptions, kuris iškviečiamas prieš meniu parodant ekrane:

    Paketas en.alexanderklimov.test; importuoti android.app.Activity; importuoti android.os.Bundle; importuoti android.view.Menu; importuoti android.view.MenuItem; importuoti android.view.View; public class TestActivity išplečia veiklą ( Meniu meniu; Būlio vertės išsaugotasMenuDogIsVisible; galutinė statinė eilutė KEY_MENU_DOG = "KEY_MENU_DOG"; @Nepaisyti viešosios void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); set_activityView); ret_Content./activity. meniu elemento matomumo duomenys if (savedInstanceState != null) ( savedMenuDogIsVisible = savedInstanceState.getBoolean(KEY_MENU_DOG, true); ) ) @Nepaisyti viešojo loginio onCreateOptionsMenu(Menu menu) ( super.onCreateOptions (meniu) .inflate(R.menu.test, menu); return true; ) public void onClick(View v) ( if (menu != null) ( MenuItem item_dog = menu.findItem(R.id.action_dog); // slėpti meniu elementas item_dog.setVisible(false); ) ) @Nepaisyti apsaugotos tuštumos onSaveInstanceState(Bundle outState) ( // TODO Automatiškai sugeneruotas metodas stub super.onSaveInstanceState(outState); if (menu != null) ( MenuItem item_dog = meniu. findItem(R.id.action_dog); // išsaugoti esamą meniu elemento būseną – tiesa arba klaidinga outState.putBoolean(KEY_MENU_DOG, item_dog.isVisible()); ) ) @Nepaisyti viešosios loginės vertės onPrepareOptionsMenu (meniu meniu) ( if (savedMenuDogIsVisible != null) ( MenuItem item_dog = menu.findItem(R.id.action_dog); // prieš parodant norimą meniu item_dog.setVisible)(IsvesVisibleDog) ;) ) grąžinti super.onPrepareOptionsMenu(meniu); ) )

    Aptikti meniu mygtuko buvimą

    Senesniuose įrenginiuose buvo naudojamas tikras meniu mygtukas. Naujose versijose Android meniu pašalintas iš ActionBar ir jo buvimas kaip atskiras mygtukas tapo neprivalomas. Tačiau daugelis gamintojų vis dar gamina telefonus su meniu mygtuku. Norėdami nustatyti, ar toks mygtukas yra, pridėta „Android 14“. naujas metodas, kuris nustatys šio mygtuko buvimą.

    If(Build.VERSION.SDK_INT<= 10 || (Build.VERSION.SDK_INT >= 14 && ViewConfiguration.get(this) .hasPermanentMenuKey())) ( // meniu klavišas yra Toast.makeText(this, "Meniu mygtukas yra", Toast.LENGTH_LONG).show(); ) else ( // Nėra meniu klavišas Toast.makeText(tai, "Nėra meniu mygtuko", Toast.LENGTH_LONG).show(); )

    Meniu žymėjimas

    Šiuolaikiniuose įrenginiuose meniu yra dalis Veiksmų juosta. Ir jūs galite tinkinti meniu išdėstymą naudodami XML.

    Tarkime, kad pasirinkote šią parinktį:

    Atribute showAsAction nenaudokite vertės niekada, kitaip nematysite žymėjimo. Pats žymėjimas nurodomas per atributą veiksmo išdėstymas. Žymėjimo kodas:

    Meniu fragmentais

    Meniu gali būti ne tik veiklos, bet ir fragmento dalis. Veikimo principas praktiškai tas pats. Fragmentas turi atitinkamą metodą.

    @Override public void onCreateOptionsMenu (meniu meniu, MenuInflater inflater) ( super.onCreateOptionsMenu (meniu, pripūtimo priemonė); inflater.inflate (R.menu.fragment_crime_list, meniu); )

    Fragment Manager atsakingas už skambutį onCreateOptionsMenu() kai veikla sulaukia atgalinio skambučio onCreateOptionsMenu() iš sistemos. Turite aiškiai pasakyti vadovui Fragment Manager kad fragmentas turėtų būti vadinamas onCreateOptionsMenu(). Tam metodas vadinamas setHasOptionsMenu():

    // Fragmento kode @Override public void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); setHasOptionsMenu(true); getActivity().setTitle(R.string.cat); ... )

Iki „Honeycomb“ („Android 3.0“) visuose „Android“ įrenginiuose po ekranu buvo mygtukas „meniu“. Kūrėjai galėjo jį naudoti taip, kaip jiems atrodo tinkama, o daugelis programų sąsajų buvo sukurtos aplink šį mygtuką. Į planšetinį kompiuterį orientuotas „Honeycomb“ žengė žingsnį nuo mechaninių (ir lietimui jautrių) mygtukų ir šiuo atžvilgiu trečiajame android versijos pasirodė „ActionBar“ klasė, kuri leido suteikti vartotojui greita prieigaį programos nustatymus per specialų skydelį, vadinamą veiksmų juosta. Pagal Google Developers Veiksmų juosta yra ateitis ir programuotojai turėtų nustoti naudoti „meniu“ mygtuką. Rinkoje šiuo metu dominuoja išmanieji telefonai su mechaniniais ar jutiklinis mygtukas po ekranu, tačiau atsiradus Ice Cream Sandwich situacija gali kardinaliai pasikeisti. Jums, kaip kūrėjui, svarbu iš anksto pasiruošti tokių įrenginių pasirodymui ir šiandien naudoti veiksmų juostos koncepciją.

Iš pirmo žvilgsnio gali atrodyti, kad naudojant veiksmų juostą kils problemų kuriant programas, skirtas Android 2.x, kurioje ši juosta dar neįdiegta. Tačiau čia nėra jokios problemos. Niekas nedraudžia toliau naudoti „meniu“ mygtuko tuose įrenginiuose, kur jis yra, pridėjus veiksmų juostą, reikės parašyti tik kelias kodo eilutes.

Jei pabandyčiau sutrumpinti šį straipsnį į vieną sakinį, jis būtų toks: " Nustatykite „targetSdkVersion“ į 14 ir pažymėkite „showAsAction="ifRoom" meniu elementuose, kurie turėtų būti pateikti veiksmų juostoje".

Galutinis nustatymų meniu atmetimas „Android“.

Neužtenka vien nustoti naudoti mygtuką „meniu“, reikia visiškai išmesti koncepciją iš galvos. Nekurkite meniu, kurkite visus reikalingus mygtukus tiesiai veiklų viduje. Jei kai kurie veiksmai netelpa į skydelį, įtraukite juos į papildomą išskleidžiamąjį meniu (veiksmo perpildymas). Aukščiau pateiktame paveikslėlyje parodyta veiksmų juosta su paieškos mygtuku ir papildomu meniu dešinėje juostos pusėje.

Jei jūsų programa sukurta sena versija„Android“ (kuri tradiciškai naudoja meniu), tada paleidus „Android 3“ planšetiniame kompiuteryje ekrano apačioje bus rodomas skydelis, imituojantis tris antrosios šakos telefonuose esančius mygtukus.

Terminija yra gana paini, tačiau išskleidžiamasis meniu (veiksmo perpildymas) siūlo visiškai kitokią naudojimo koncepciją nei paprastas nustatymų meniu. Užuot galvoję apie meniu kaip visų programos nustatymų saugyklą, sukuriate skydelį, kuriame pateikiate pagrindinius nustatymus. Viskas, kas antra, pašalinama išskleidžiamajame meniu, kuris iškviečiamas spustelėjus mygtuką su trimis taškais (veiksmo perpildymo mygtukas) dešinėje skydelio pusėje.

veiksmo perpildymo mygtukas

Jei paleidote programas, skirtas Android 2.3 ir senesnėms versijoms įrenginiuose, kuriuose nėra mygtukų po ekranu (pvz., planšetiniame kompiuteryje su "Honeycomb" arba "Galaxy Nexus"), galbūt pastebėjote, kad šalia vaizdo rodomas mygtukas Action overflow trys mygtukai skydelyje apačioje (trys taškai vienas ant kito). Tai kompromisas, bet ne itin geras. Programose, kurios visiškai nenaudoja nustatymų meniu, šis mygtukas nieko nedaro, erzindamas vartotojus. Todėl labai geras sprendimas būtų sekti android versija, o jei programa veikia naudojant 3.0 ar naujesnės versijos Android, pašalinkite šį mygtuką iš naršymo juostos ir naudokite veiksmų juostą. Šis metodas leidžia išlaikyti programą suderinamą su senais įrenginiais ir padaryti ją patrauklesnę naujiems.

Jei programa veikia įrenginiuose be mygtukų, sistema nusprendžia, ar naršymo juostoje pridėti veiksmų perpildymą, atsižvelgdama į lauko reikšmę manifeste. Logika yra tokia

  • Jei nustatysite minSdkVersion arba targetSdkVersion reikšmę, didesnę nei 11, sistema šio mygtuko neprideda.
  • Kita vertus, sistema sukuria šį mygtuką, kai paleidžiate programą „Android 3.0“ ir naujesnėje versijoje.
  • Vienintelė išimtis yra tada, kai nustatote minSdkVersion į 10 arba mažesnę; „targetSdkVersion“ į 11, 12 arba 13 ir nenaudos „ActionBar“, sistema pridės šį mygtuką telefonuose (ne planšetiniuose kompiuteriuose). Android valdymas 4.0 ir naujesnės versijos. Ši išimtis pagrįsta tokia idėja: jei kuriate aplikaciją antros šakos telefonams ir trečiosios planšetiniams kompiuteriams, tuomet manote, kad telefonuose turi būti meniu mygtukas, o planšetiniuose kompiuteriuose – ne.

Taigi, jei norite išjungti naršymo juostoje esančio mygtuko perpildymo veiksmą, turite nustatyti targetSdkVersion į 14 (galite parašyti daugiau nei maža vertė kad programa galėtų veikti senesniuose įrenginiuose).

Perėjimas prie veiksmų juostos koncepcijos

Jei turite veiklų, kurioms naudojamas parinkčių meniu (sukurtas naudojant onCreateOptionsMenu()), tada pašalindami mygtuką iš naršymo juostos (nustatydami targetSdkVersion=14) turėtumėte suteikti vartotojui alternatyvias galimybes pasiekti parinktis. Laimei, jums nereikia daug dirbti, nes sistema automatiškai sukuria veiksmų juostą.

Pridėkite showAsAction="ifRoom" prie savo žymų elementus, kuriuos norite įdėti į veiksmų juostą. Jei nesate tikri, kurį elementą įtraukti į veiksmų juostą, žr. Android dizaino veiksmų juostos vadovą .

Kad jūsų programos suvokimas būtų visapusiškesnis, rekomenduojame naudoti piktogramas iš Android UX komanda. Archyvas .

Kaip pašalinti veiksmų juostą iš „Android“ programos

Jei veiksmų juostos jums nereikia, galite ją pašalinti iš bet kokios veiklos ar net iš programos. Tai gali būti aktualu žaidimams ir programoms, kurios nenaudoja nustatymų meniu. Veiksmų juostą galite pašalinti naudodami temą Theme.Holo.NoActionBar arba Theme.DeviceDefault.NoActionBar.

Jei norite naudoti šias schemas, bet laikykitės suderinama atgal, galite naudoti išteklių valdymo sistemą norėdami nustatyti skirtingas temas skirtingos versijos platformos. Ši tema nagrinėjama išsamiau čia. Turėsite sukurti savo temą, kuri bus paveldima iš temų įvairios platformos priklausomai nuo dabartinės versijos.

Pavyzdžiui, galite deklaruoti savo programos temą

(arba tam tikrai veiklai žymoje ).

Įrenginiams, kuriuose veikia „Android 2“, įtraukite šią temą į res/values/themes.xml.



Jei naudojate Honeycomb, įtraukite šią temą į res/values-v11/themes.xml.



Paleidžiant, priklausomai nuo API versijos, sistema pasirinks tinkamą temą.

Išvada

Apibendrinkime pagrindines straipsnio idėjas ir dalykus:

  • Ant naujas Androidįrenginiuose gali nebūti mygtuko „meniu“, todėl kuriant programas verčiau jo visai atsisakyti.
  • Nustatykite „targetSdkVersion“ = 14 ir išbandykite programą naudodami 4.0 versijos „Android“.
  • Pridėkite žymą showAsAction="ifRoom" prie meniu elementą, jei norite, kad jis automatiškai patektų į veiksmų juostą.
  • Jei jūsų programoje nenaudojama „ActionBar“, galite ją pašalinti naudodami „Theme.Holo.NoActionBar“ ir „Theme.DeviceDefault.NoActionBar“ temas.

Android palaiko kelių tipų meniu. Pirma – telefone yra atskiras mygtukas Meniu(senesniuose telefonuose), kurį paspaudus pasirodo meniu. Naujuose įrenginiuose atskiras mygtukas buvo pašalintas, pakeitus jį meniu piktograma trys taškai vertikalioje padėtyje. Antrasis tipas yra kontekstinis meniu, kuris pasirodo, kai paspaudžiate ir laikote pirštą ant ekrano tinkama vieta(Taip pat galite paspausti ir palaikyti centrinį telefono mygtuką). Kontekstinis meniu savo ruožtu gali turėti submeniu. Šiandien susipažinsime su pirmojo tipo meniu. Šiame straipsnyje bus aptartas darbas su meniu naujuose įrenginiuose, kuriuose veikia 4.0 ir naujesnės versijos „Android“.

Šablone tuščia veikla meniu nėra, todėl jį sukursime patys. Tai padės suprasti, kaip tai veikia, ir susidaryti bendrą projekto idėją. Norint pasirinkti meniu elementus, nebūtina įsiminti klasių pavadinimų, metodų ir kodų. Kituose šablonuose meniu bus integruotas ir galėsite jį naudoti iš karto.

Sukurti naujas projektas remiantis tuščia veikla ir paleiskite jį. Meniu dar nėra.

Sukurkite kelis eilučių išteklius faile res/values/strings.xml, kuri bus atsakinga už meniu elementus:

Nustatymai Katė Katė Kitty

Dabar sukurkite naują aplanką Meniu aplanke res res, | Nauja | Katalogas). Tada sukurkite failą sukurtame aplanke meniu_main.xml- pavadinimas rodo, kad meniu priklauso pagrindinei veiklai Pagrindinis užsiėmimas(dešiniuoju pelės mygtuku spustelėkite aplanką Meniu | Nauja | Meniu išteklių failas). Jei kuriate programą su keliais ekranais, kiekviena veikla turės atskirą meniu su savo nustatymais. Atidarant failą meniu_main.xml ir pridėkite mūsų kodą prie gauto šablono:

Atidarykime failą Pagrindinis užsiėmimas. Šiuo metu jis turi tik vieną metodą. onCreate (). Pridėkime naują metodą onCreateOptionsMenu(). Būtent šis metodas yra atsakingas už meniu atsiradimą veikloje. Pasirinkite iš studijos meniu Kodas| ir kitame lange pirmomis raidėmis pradėkite rašyti metodo pavadinimą. Galima įvesti pirmas Didžiosios raidės, t.y. ocom( o n C norma O galimybės M enu), kad greitai rastumėte norimą eilutę. Paspaudžiame mygtuką Gerai ir gauname ruošinį.

@Nepaisyti viešosios loginės reikšmės onCreateOptionsMenu(meniu meniu) (grįžti super.onCreateOptionsMenu(meniu); )

Prie paruošimo pridedame metodą, kuris paima duomenis iš meniu išteklių ir konvertuoja juos į meniu elementus ekrane.

@Nepaisyti viešosios loginės vertės onCreateOptionsMenu(Meniu meniu) ( getMenuInflater().inflate(R.menu.menu_main, menu); return true; )

Pagal metodą pripūsti () Jūs nurodote meniu šaltinį ( R.menu.menu_main) ir klasės objektas Meniu.

Anglų kalba „išpūsti“ verčiama kaip išpūsti, t.y. pagal dizainą android kūrėjai, mes tarsi pripučiame objektą duomenimis, pavyzdžiui, meniu. Tačiau iš tikrųjų žodis „išpūsti“ kilęs iš šios frazės butas- į butą. Sena tradicija į butą paleisti pirmąją katę, kuri ištiria visus namo kampelius ir pareiškia sutikimą jame gyventi. Taigi mes paleidžiame duomenis iš XML failo į MenuInflater objektą.

Vykdykite projektą. Dabar dešinėje antraštės pusėje pamatysite trijų taškų piktogramą, išdėstytą vertikali linija. Spustelėkite piktogramą, kad pamatytumėte meniu elementą Nustatymai.

Kaip nesunku atspėti, elementas daiktas yra atsakingas už atskirą meniu punktą. Taip pat pridėkime dar tris elementus, pakeisdami tik meniu identifikatorių ir tekstą:

Vykdykite projektą ir pabandykite dar kartą iškviesti meniu. Pamatysite tris naujus elementus.

Galimybės id ir titulą paaiškinimo nereikia. Parametras orderInCategory leidžia nustatyti savo meniu elementų rodymo tvarką. Tarkime, kad sukūrėte penkis meniu elementus, bet dar neapsisprendėte, kokia tvarka jie bus rodomi ekrane. Kad nebūtų nuolat perkeliami ištisi meniu elementų kodo blokai teisingas užsakymas, galite naudoti šią parinktį.

Ir galiausiai, svarbus atributas programa:showAsAction apibrėžia meniu elgseną Veiksmų juosta. Reikšmė niekada reiškia, kad meniu punktas turi būti rodomas ne antraštėje, o tik iššokančiame meniu, t.y. būti už trijų taškų. Jei nustatote vertę visada, tada taškas Nustatymai iš karto pasirodys jūsų paraiškos antraštėje. Taip pat galimos vertės ifRooms, su tekstu ir CollapseActionView. Išbandykite patys. Pavyzdžiui, ifRoom Rodo meniu elementą, jei yra vietos. Jei taškų daug, tai jie tik trukdys. Paprastai ši parinktis rodo labai trumpą žodį arba piktogramą, skirtą dažnoms operacijoms, kad būtų išvengta nereikalingų trijų taškų paspaudimų.

Atkreipkite dėmesį į atributą programa:showAsAction, kuri priklauso vardų erdvei xmlns:app="http://schemas.android.com/apk/res-auto". Buvo laikas, kai tokios vardų erdvės nebuvo ir projektai naudojo šį atributą android:showAsAction iš standartinės vardų srities. Jei studija prisiekia klaidą, redaguokite kodą.

Kol bus vykdomi meniu elementai naudingo darbo. Bet koks elemento paspaudimas tiesiog uždaro meniu be matomų pasekmių. Dar neparašėme kodo paspaudimams apdoroti.

Meniu elementų pasirinkimas

Išmokome sudaryti meniu. Tačiau kol kas tai nenaudinga, nes meniu elementai niekaip nereaguoja į mūsų paspaudimus. Kitas metodas naudojamas meniu paspaudimams valdyti. onOptionsItemSelected(). Pridėkime metodą taip pat, kaip ir ankstesniame pavyzdyje. Pradėkime pasiruošimą.

@Nepaisyti viešosios loginės reikšmės onOptionsItemSelected(MenuItem elementas) ( grąžinti super.onOptionsItemSelected(item); )

Parametras daiktas atsakingas už meniu punktą. Turėtumėte gauti meniu ID naudodami metodą getItemId() ir įveskite jo kodą. Kadangi meniu dažniausiai susideda iš kelių punktų, patogu naudoti konstrukcijas jei/kitaip arba jungiklis. Norėdami rodyti informaciją, naudojame tekstinę etiketę. Pridėkite komponentą prie veiklos ekrano teksto rodinys. Galite naudoti esamą teksto rodinys su užrašu „Sveikas pasaulis!“, tiesiog pateikite asmens dokumentą.

android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Sveikas, pasauli!"/>

Įtraukime kodą į pasirinkto meniu elemento tuščią vietą:

@Nepaisyti viešosios loginės vertės onOptionsItemSelected(MenuItem item) ( // Gaukite pasirinkto meniu elemento ID int id = item.getItemId(); TextView infoTextView = (TextView) findViewById(R.id.textView); // Pasirinkto pasirinkto operacijos meniu elemento jungiklis ( id) (atvejis R.id.action_cat1: infoTextView.setText("Jūs pasirinkote katę!"); return true; atvejis R.id.action_cat2: infoTextView.setText("Jūs pasirinkote katę!"); return true; case R. id.action_cat3: infoTextView.setText("Jūs pasirinkote kačiuką!"); return true; default: return super.onOptionsItemSelected(item); ) )

Paleiskite programą, iškvieskite meniu ir pasirinkite bet kurį meniu elementą. Teksto laukelyje turėtų pasirodyti pranešimas.

Egzistuoja alternatyvus būdas per XML, panašus į mygtukų paspaudimų valdymą (nuo Android 3.0). Galite pridėti atributą android:onclick meniu šaltiniuose ir jums nereikia naudoti metodo iškvietimo onOptionsItemSelected(). Su pagalba android:onclick pasirinkdami meniu elementą galite nurodyti norimą metodą. Pridėkite šį atributą prie elemento Nustatymai

Dabar veiklos kode parašysime taip:

// Nustatymai meniu elemento atributas nustatytas į android:onClick="onSettingsMenuClick" public void onSettingsMenuClick(MenuItem item) ( TextView infoTextView = (TextView) findViewById(R.id.textView); infoTextView.setText("Jūs pasirinkote nustatymus, Geriau rinkčiausi katę“);)

Jungikliai

Meniu elementų išvaizda gali būti pakeista į vaizdą radijo mygtukais. Norėdami tai padaryti, pridėkite elementą grupė su atributu android:checkableBehavior="single":

Nematau daug prasmės šiame režime. Ir mes to nesvarstysime.

Dizaino režimas

„Android Studio 2.2“ pridėjo grafinį režimą, leidžiantį kurti meniu, kurie atrodo kaip įrankių juosta, skirta naujiems komponentams į ekraną įtraukti. Meniu juostą sudaro keturi elementai: Meniu elementas, Ieškoti elemento, Meniu, grupė.

Principas tas pats, pasirinkite norimą elementą ir vilkite jį į ekraną į meniu sritį. Jei išmokote rankiniu būdu sukurti meniu, tada tokiu būdu nesukels tau problemų. Naudodami jį galite greitai nubraižyti meniu struktūrą, o tada ją koreguoti rankiniu būdu.