Programmering

Android Studio for nybegynnere, del 2: Utforsk og kode appen

Oppdatert: januar 2020.

I del 1 av denne nybegynnerens introduksjon til Android Studio, satte du opp Android Studio i ditt utviklingsmiljø og ble kjent med brukergrensesnittet. Nå, i del 2, koder du den første appen din.

Den animerte mobilappen består av en enkelt aktivitet, som presenterer Googles Android-robotkarakter og en knapp for å animere karakteren. Ved å klikke på knappen endres karakteren gradvis fra grønt til rødt til blått, deretter tilbake til grønt. Selv om appen ikke er spesielt nyttig, vil det hjelpe deg å bli komfortabel med å bruke Android Studio ved å skrive den. I del 3 vil du bygge og kjøre appen ved hjelp av en Android-enhetsemulator og et Kindle Fire-nettbrett.

Vær oppmerksom på at denne serien er oppdatert for Android Studio 3.2.1, den nåværende stabile utgivelsen i skrivende stund.

Android Studios prosjekt- og redigeringsvinduer

Jeg introduserte Android Studios hovedvindu på slutten av del 1. Dette vinduet er delt inn i flere områder, inkludert et prosjektvindu der du identifiserer ressursfiler til en app, og forskjellige redigeringsvinduer der du skriver koden og spesifiserer ressurser for mobilapper. i Android Studio. Prosjektvinduet og et redigeringsvindu er vist i figur 1.

Jeff Friesen

Prosjektvinduet fremhever W2A, som er navnet på appen W2A.java kildefilen (selv om .java filtypen vises ikke). Tilsvarer W2A er et redigeringsvindu som nås ved å dobbeltklikke W2A i prosjektvinduet. Editor-vinduet avslører filens nåværende innhold, i dette tilfellet skjelett-Java-kildekoden for appens hovedaktivitet.

Hvert redigeringsvindu er tilknyttet en fane. For eksempel, W2Aredigeringsvinduet er knyttet til en W2A.java fanen. En annen fane identifisert som main.xml (standard XML-basert layout for appens hovedaktivitet) vises også. Du flytter fra ett redigeringsvindu til et annet ved å klikke på vinduets fane.

last ned Få koden Last ned kildekoden for Android-eksempelappen: W2A.java. Skapt av Jeff Friesen for JavaWorld.

Android-eksempelappen

Eksempelappen (W2A.java) består av en hovedaktivitet som viser Android-robotkarakteren og en knapp. Når brukeren trykker på knappen, animerer roboten gjennom en serie farger. I denne delen vil vi utforske aktivitetens kildekode og ressurser.

Utforsk og kode Android-eksempelappen

Aktivitetens kildekode er lagret i filen W2A.java, presentert i Listing 1.

Oppføring 1. W2A.java

 pakke ca. javajeff.w2a; importere android.app.Activity; importere android.graphics.drawable.AnimationDrawable; importere android.os.Bundle; importere android.view.View; importere android.widget.Button; importere android.widget.ImageView; offentlig klasse W2A utvider aktivitet {AnimationDrawable androidAnimation; @ Override public void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.main); ImageView androidImage = (ImageView) findViewById (R.id.android); androidImage.setBackgroundResource (R.drawable.android_animate); androidAnimation = (AnimationDrawable) androidImage.getBackground (); final Button btnAnimate = (Button) findViewById (R.id.animate); View.OnClickListener ocl; ocl = new View.OnClickListener () {@Override public void onClick (View v) {androidAnimation.stop (); androidAnimation.start (); }}; btnAnimate.setOnClickListener (ocl); }} 

De W2A.java filen starter med en pakkeerklæring, som navngir pakken (ca.javajeff.w2a) som lagrer W2A klasse. Dette etterfølges av en serie importuttalelser for forskjellige Android API-typer. Deretter beskriver koden W2A klasse, som strekker seg android.app.Activity.

W2A først erklærer en androidAnimation forekomstfelt av typen android.graphics.drawable.AnimationDrawable. Objekter av typen AnimasjonTegnbar beskrive ramme-for-ramme-animasjoner, der den nåværende tegningen erstattes med den neste tegningen i animasjonssekvensen.

Hva er en tegning?

EN tegnes er noe som kan tegnes, for eksempel et bilde. AnimasjonTegnbar utvider indirekte det abstrakte android.graphics.drawable.Drawable klasse, som er en generell abstraksjon for en tegning.

OnCreate () -metoden

Alt av appens arbeid foregår i W2Aer overordnet onCreate (pakke) metode: ingen andre metoder er nødvendige, noe som hjelper til med å holde denne appen enkel.

onCreate (pakke) først påkaller den samme navnet superklassemetoden, en regel som må følges av alle overordnede aktivitetsmetoder.

Denne metoden kjøres deretter setContentView (R.layout.main) for å etablere appens brukergrensesnitt. R.layout. Hoved er en identifikator (ID) for en applikasjonsressurs, som ligger i en egen fil. Du tolker denne ID-en slik:

  • R er navnet på en klasse som genereres når appen bygges. Denne klassen heter R fordi innholdet identifiserer forskjellige typer applikasjonsressurser, inkludert layouter, bilder, strenger og farger.
  • oppsett er navnet på en klasse som er nestet i R. En applikasjonsressurs hvis ID er lagret i denne klassen, beskriver en bestemt layoutressurs. Hver type applikasjonsressurs er assosiert med en nestet klasse som er navngitt på en lignende måte. For eksempel, streng identifiserer strengressurser.
  • hoved- er navnet på en int-basert konstant erklært innenfor oppsett. Denne ressurs-ID-en identifiserer hovedoppsettressursen. Nærmere bestemt, hoved- refererer til en main.xml fil som lagrer hovedaktivitets layoutinformasjon. hoved- er W2Aer den eneste layoutressursen.

Passering R.layout. Hoved til Aktivitets ugyldig setContentView (int layoutResID) metoden instruerer Android om å lage et brukergrensesnittskjermbilde ved å bruke layoutinformasjonen som er lagret i main.xml. Bak kulissene oppretter Android brukergrensesnittkomponentene beskrevet i main.xml og plasserer dem på enhetsskjermen som spesifisert av main.xmllayout av data.

Skjermen er basert på utsikt (abstraksjoner av komponenter i brukergrensesnittet) og se grupper (viser gruppering av relaterte brukergrensesnittkomponenter). Visninger er forekomster av klasser som underklasser android.view.View klasse og er analoge med AWT / Swing-komponenter. Vis grupper er forekomster av klasser som underklasser det abstrakte android.view.ViewGroup klasse og er analoge med AWT / Swing containere. Android refererer til spesifikke visninger (for eksempel knapper eller spinnere) som widgets.

Fortsetter, onCreate (pakke) utfører ImageView androidImage = (ImageView) findViewById (R.id.android);. Denne uttalelsen kaller først Utsikts Vis findViewById (int id) metode for å finne android.widget.ImageView element erklært i main.xml og identifisert som Android. Det øyeblikkelig ImageView og initialiserer den til verdiene deklarert i main.xml fil. Uttalelsen lagrer deretter dette objektets referanse i lokal variabel androidImage.

ImageView og AnimationDrawable

Neste, den androidImage.setBackgroundResource (R.drawable.android_animate); uttalelse påkaller ImageViewer arvet (fra Utsikt) ugyldig setBackgroundResource (int resID) metode, og setter visningens bakgrunn til ressursen identifisert av resID. De R.drawable.android_animate argument identifiserer en XML-fil med navnet android_animate.xml (presentert senere), som lagrer informasjon om animasjonen, og som er lagret i ress tegnes underkatalog. De setBackgroundResource () ring lenker androidImage visning til bildesekvensen beskrevet av android_animate.xml, som vil bli tegnet på dette synet. Det opprinnelige bildet tegnes som et resultat av denne metoden.

ImageView lar en app animere en rekke tegninger ved å ringe AnimasjonTegnbar metoder. Før appen kan gjøre dette, må den skaffe seg ImageViews AnimasjonTegnbar. De androidAnimation = (AnimationDrawable) androidImage.getBackground (); oppgaveuttalelse som følger utfører denne oppgaven ved å påkalle ImageViewer arvet (fra Utsikt) Tegnbar getBackground () metode. Denne metoden returnerer AnimasjonTegnbar for det gitte ImageView, som deretter tildeles til androidAnimation felt. De AnimasjonTegnbar forekomst brukes til å starte og stoppe en animasjon, en prosess jeg vil beskrive snart.

Endelig, onCreate (pakke) skaper Animer knapp. Den påkaller findByViewId (int) for å hente knappinformasjonen fra main.xml, deretter instanserer android.widget.Button klasse.

Den bruker deretter Utsikt klassen er nestet onClickListener grensesnitt for å lage et lytterobjekt. Dette objektet er ugyldig onClick (Vis v) metoden påkalles når brukeren klikker på knappen. Lytteren er registrert med sin Knapp objekt ved å ringe Utsikts ugyldig setOnClickListener (AdapterView.OnClickListener lytter) metode.

For å stoppe, start deretter animasjonen, AnimerKlikklytter påkaller androidAnimation.stop (); etterfulgt av androidAnimation.start ();. De Stoppe() metoden kalles før start() for å sikre at et påfølgende klikk på Animer -knappen får en ny animasjon til å begynne.

Oppdater og lagre koden din

Før vi fortsetter, bytt ut skjelettkoden i din W2A.java kategorien med koden fra oppføring 1. Lagre innholdet i dette vinduet ved å trykke på Ctrl + S, eller velg Lagre alt fra Fil Meny.

Koding av Android-appens main.xml

Appens hovedaktivitet er knyttet til et XML-basert oppsett, som er lagret i fil main.xml, og som er presentert i Listing 2.

Oppføring 2. main.xml

Etter XML-erklæringen erklærer Listing 2 a Lineær oppsett element som spesifiserer a oppsett (en visningsgruppe som ordner inneholdte visninger på en Android-enhets skjerm på en eller annen måte) for å ordne inneholdte widgets (inkludert nestede oppsett) enten horisontalt eller vertikalt over skjermen.

De tag spesifiserer flere attributter for å kontrollere dette lineære oppsettet. Disse attributtene inkluderer følgende:

  • orientering identifiserer den lineære utformingen som horisontal eller vertikal. Inneholdte widgets er lagt ut horisontalt eller vertikalt, og standardretningen er vannrett. "horisontal" og "vertikal" er de eneste juridiske verdiene som kan tildeles dette attributtet.
  • layout_width identifiserer bredden på oppsettet. Juridiske verdier inkluderer "fill_parent" (å være like bred som foreldrene) og "wrap_content" (for å være bred nok til å legge inn innhold). (Noter det fyll_forelder ble omdøpt til match_parent i Android 2.2, men støttes fortsatt og brukes mye.)
  • layout_høyde identifiserer høyden på oppsettet. Juridiske verdier inkluderer "fill_parent" (å være like høy som foreldrene) og "wrap_content" (for å være høy nok til å legge inn innhold).
  • tyngdekraften identifiserer hvordan oppsettet er plassert i forhold til skjermen. For eksempel, "senter" angir at oppsettet skal være sentrert horisontalt og vertikalt på skjermen.
  • bakgrunn identifiserer et bakgrunnsbilde, en gradient eller en solid farge. For enkelhets skyld har jeg hardkodet en heksadesimal fargeidentifikator for å betegne en solid hvit bakgrunn (#ffffff). (Farger lagres normalt i farger.xml og referert fra denne filen.)

De Lineær oppsett element innkapsler ImageView og Knapp elementer. Hvert av disse elementene spesifiserer en id attributt, som identifiserer elementet slik at det kan refereres til det fra kode. De ressursidentifikator (spesiell syntaks som begynner med @) tilordnet dette attributtet begynner med @ + id prefiks. For eksempel, @ + id / android identifiserer ImageView element som Android; dette elementet er referert fra kode ved å spesifisere R.id. Android.

Disse elementene spesifiserer også layout_width og layout_høyde attributter for å bestemme hvordan innholdet deres er lagt ut. Hver attributt tildeles wrap_content slik at elementet vises i sin naturlige størrelse.

ImageView spesifiserer en layout_marginBunn attributt for å identifisere en mellomrom mellom seg selv og knappen som følger loddrett. Plassen er spesifisert som 10 fall, eller tetthetsuavhengige piksler. Dette er virtuelle piksler som apper kan bruke til å uttrykke oppsettdimensjoner / -posisjoner på en skjermdensitetsuavhengig måte.

Tetthetsuavhengige piksler

EN tetthetsuavhengig piksel (dip) tilsvarer en fysisk piksel på en 160-dpi skjerm, basetettheten antatt av Android. På kjøretid håndterer Android gjennomsiktig enhver skalering av de nødvendige dip-enhetene, basert på den faktiske tettheten til skjermen som er i bruk. Dypenheter konverteres til skjermpiksler via ligningen: piksler = fall * (tetthet / 160). For eksempel, på en 240-dpi skjerm, tilsvarer 1 dip 1,5 fysiske piksler. Google anbefaler at du bruker dip-enheter for å definere appens brukergrensesnitt for å sikre riktig visning av brukergrensesnittet på forskjellige enhetsskjermer.

Velge og lagre et nytt oppsett

$config[zx-auto] not found$config[zx-overlay] not found