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.

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 W2A
er 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 heterR
fordi innholdet identifiserer forskjellige typer applikasjonsressurser, inkludert layouter, bilder, strenger og farger.oppsett
er navnet på en klasse som er nestet iR
. 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å enint
-basert konstant erklært innenforoppsett
. Denne ressurs-ID-en identifiserer hovedoppsettressursen. Nærmere bestemt,hoved-
refererer til enmain.xml
fil som lagrer hovedaktivitets layoutinformasjon.hoved-
erW2A
er den eneste layoutressursen.
Passering R.layout. Hoved
til Aktivitet
s 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.xml
layout 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 Utsikt
s 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 ImageView
er 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 res
s 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 ImageView
s AnimasjonTegnbar
. De androidAnimation = (AnimationDrawable) androidImage.getBackground ();
oppgaveuttalelse som følger utfører denne oppgaven ved å påkalle ImageView
er 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 Utsikt
s 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 detfyll_forelder
ble omdøpt tilmatch_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 ifarger.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.