Opdateret: januar 2020.
I del 1 af denne begynderintroduktion til Android Studio opsatte du Android Studio i dit udviklingsmiljø og lærte brugergrænsefladen at kende. Nu, i del 2, koder du din første app.
Den animerede mobilapp består af en enkelt aktivitet, der præsenterer Googles Android-robotkarakter og en knap til at animere karakteren. Ved at klikke på knappen skifter karakteren gradvist farve fra grøn til rød til blå og derefter tilbage til grøn. Selvom appen ikke er særlig nyttig, kan skrivning af den hjælpe dig med at blive fortrolig med at bruge Android Studio. I del 3 bygger du og kører appen ved hjælp af en Android-enhedsemulator og en Kindle Fire-tablet.
Bemærk, at denne serie er blevet opdateret til Android Studio 3.2.1, den nuværende stabile udgivelse i skrivende stund.
Android Studios projekt- og redigeringsvinduer
Jeg introducerede Android Studios hovedvindue i slutningen af del 1. Dette vindue er opdelt i flere områder, herunder et projektvindue, hvor du identificerer en apps ressourcefiler og forskellige editorvinduer, hvor du skriver koden og angiver ressourcer til mobilapps. i Android Studio. Projektvinduet og et editorvindue vises i figur 1.
Jeff FriesenProjektvinduet fremhæver W2A, som er navnet på appen W2A.java
kildefil (selvom .java
filtypenavnet vises ikke). Svarende til W2A er et redigeringsvindue, der nås ved at dobbeltklikke W2A i projektvinduet. Editor-vinduet afslører filens aktuelle indhold, i dette tilfælde Java-skeletkildekoden til appens hovedaktivitet.
Hvert editorvindue er knyttet til en fane. For eksempel, W2A's editor vindue er knyttet til en W2A.java fanen. En anden fane identificeret som main.xml (det standard XML-baserede layout til appens hovedaktivitet) vises også. Du flytter fra et redigeringsvindue til et andet ved at klikke på vinduets fane.
download Hent koden Download kildekoden til Android-eksempelappen: W2A.java. Oprettet af Jeff Friesen til JavaWorld.Android-eksempelappen
Eksemplet på appen (W2A.java) består af en hovedaktivitet, der viser Android-robotkarakteren og en knap. Når brugeren trykker på knappen, animerer robotten gennem en række farver. I dette afsnit udforsker vi aktivitetens kildekode og ressourcer.
Udforsk og kode Android-eksempelappen
Aktivitetens kildekode er gemt i filen W2A.java
, præsenteret i liste 1.
Liste 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 udvider aktivitet {AnimationDrawable androidAnimation; @ Overstyr offentlig tomrum onCreate (Bundt gemtInstanceState) {super.onCreate (gemtInstansStat); 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 = ny View.OnClickListener () {@Override offentlig ugyldighed onClick (Vis v) {androidAnimation.stop (); androidAnimation.start (); }}; btnAnimate.setOnClickListener (ocl); }}
Det W2A.java
filen starter med en pakkeerklæring, der navngiver pakken (ca. javajeff.w2a
) der gemmer W2A
klasse. Dette efterfølges af en række importerklæringer til forskellige Android API-typer. Dernæst beskriver koden W2A
klasse, der strækker sig android.app.Aktivitet
.
W2A
erklærer først en androidAnimation
forekomstfelt af typen android.graphics.drawable.AnimationDrawable
. Objekter af typen AnimationTegnbar
beskrive ramme-for-ramme-animationer, hvor den aktuelle tegneserie erstattes med den næste tegneserie i animationssekvensen.
Hvad er en tegning?
EN trækkes er noget der kan tegnes, f.eks. et billede. AnimationTegnbar
indirekte udvider det abstrakte android.graphics.drawable.Drawable
klasse, som er en generel abstraktion for en tegning.
Metoden onCreate ()
Alt appens arbejde finder sted i W2A
er overordnet onCreate (pakke)
metode: der kræves ingen andre metoder, hvilket hjælper med at holde denne app enkel.
onCreate (pakke)
først påberåber den samme navngivne superklassemetode, en regel, der skal følges af alle overordnede aktivitetsmetoder.
Denne metode udføres derefter setContentView (R.layout.main)
for at etablere appens brugergrænseflade. R.layout. Hoved
er en identifikator (ID) for en applikationsressource, der findes i en separat fil. Du fortolker dette ID som følger:
R
er navnet på en klasse, der genereres, når appen bygges. Denne klasse er navngivetR
fordi dets indhold identificerer forskellige slags applikationsressourcer, herunder layout, billeder, strenge og farver.layout
er navnet på en klasse, der er indlejret iR
. En applikationsressource, hvis id er gemt i denne klasse, beskriver en bestemt layoutressource. Hver type applikationsressource er forbundet med en indlejret klasse, der er navngivet på en lignende måde. For eksempel,snor
identificerer strengressourcer.vigtigste
er navnet på enint
-baseret konstant erklæret indenilayout
. Dette ressource-id identificerer hovedlayoutressourcen. Specifiktvigtigste
henviser til enmain.xml
fil, der gemmer hovedaktivitets layoutoplysninger.vigtigste
erW2A
's eneste layoutressource.
Aflevering R.layout. Hoved
til Aktivitet
's ugyldigt setContentView (int layoutResID)
metoden instruerer Android om at oprette en brugergrænsefladeskærm ved hjælp af de layoutoplysninger, der er gemt i main.xml
. Bag kulisserne opretter Android de brugergrænsefladekomponenter, der er beskrevet i main.xml
og placerer dem på enhedens skærm som specificeret af main.xml
's layoutdata.
Skærmen er baseret på synspunkter (abstraktioner af brugergrænsefladekomponenter) og se grupper (viser de grupperelaterede brugerinterfacekomponenter). Visninger er forekomster af klasser, der underklasser android.view.View
klasse og er analoge med AWT / Swing-komponenter. Se grupper er forekomster af klasser, der underklasserer det abstrakte android.view.ViewGroup
klasse og er analoge med AWT / Swing containere. Android henviser til specifikke visninger (såsom knapper eller spinnere) som widgets.
Fortsætter, onCreate (pakke)
udfører ImageView androidImage = (ImageView) findViewById (R.id.android);
. Denne erklæring kalder først Udsigt
's Se findViewById (int id)
metode til at finde android.widget.ImageView
element erklæret i main.xml
og identificeret som Android
. Det øjeblikkeligt ImageView
og initialiserer den til de værdier, der er angivet i main.xml
fil. Erklæringen gemmer derefter dette objekts reference i lokal variabel androidImage
.
ImageView og AnimationDrawable
Dernæst androidImage.setBackgroundResource (R.drawable.android_animate);
erklæring påberåber sig ImageView
er nedarvet (fra Udsigt
) ugyldigt setBackgroundResource (int resID)
metode, der indstiller visningens baggrund til den ressource, der er identificeret af resID
. Det R.drawable.android_animate
argument identificerer en XML-fil med navnet android_animate.xml
(præsenteret senere), som gemmer information om animationen, og som er gemt i res
's trækkes
underkatalog. Det setBackgroundResource ()
opkald forbinder androidImage
visning til rækkefølgen af billeder beskrevet af android_animate.xml
, som vil blive trukket på dette synspunkt. Det oprindelige billede tegnes som et resultat af denne metodeopkald.
ImageView
lader en app animere en række tegninger ved at ringe AnimationTegnbar
metoder. Før appen kan gøre dette, skal den indhente ImageView
's AnimationTegnbar
. Det androidAnimation = (AnimationDrawable) androidImage.getBackground ();
opgaveerklæring, der følger, udfører denne opgave ved at påberåbe sig ImageView
er nedarvet (fra Udsigt
) Tegneserie getBackground ()
metode. Denne metode returnerer AnimationTegnbar
for det givne ImageView
, som efterfølgende tildeles til androidAnimation
Mark. Det AnimationTegnbar
instans bruges til at starte og stoppe en animation, en proces, jeg kort beskriver.
Langt om længe, onCreate (pakke)
skaber Animer knap. Det påberåber sig findByViewId (int)
for at hente knapoplysningerne fra main.xml
, derefter instantierer android.widget.Button
klasse.
Derefter beskæftiger den Udsigt
klassen er indlejret onClickListener
interface til at oprette et lytterobjekt. Dette objekt er ugyldigt onClick (Vis v)
metode påberåbes, når brugeren klikker på knappen. Lytteren er registreret med sin Knap
objekt ved at ringe Udsigt
's ugyldigt setOnClickListener (AdapterView.OnClickListener lytter)
metode.
For at stoppe skal du starte animationen, Animer's kliklytter påberåber sig androidAnimation.stop ();
efterfulgt af androidAnimation.start ();
. Det hold op()
metode kaldes før Start()
for at sikre, at et efterfølgende klik på Animer -knappen får en ny animation til at begynde.
Opdater og gem din kode
Inden vi fortsætter, skal du udskifte skeletkoden i din W2A.java fane med koden fra oversigt 1. Gem indholdet af dette vindue ved at trykke på Ctrl + Seller vælg Gem alle fra Fil menu.
Kodning af Android-appens main.xml
Appens hovedaktivitet er forbundet med et XML-baseret layout, der er gemt i fil main.xml
, og som er præsenteret i liste 2.
Liste 2. main.xml
Efter XML-erklæringen erklærer Listing 2 en Lineær layout
element, der specificerer en layout (en visningsgruppe, der arrangerer indeholdte visninger på en Android-enheds skærm på en eller anden måde) til at arrangere indeholdte widgets (inklusive indlejrede layout) enten vandret eller lodret på tværs af skærmen.
Det tag specificerer flere attributter til styring af dette lineære layout. Disse attributter inkluderer følgende:
orientering
identificerer det lineære layout som vandret eller lodret. Indeholdte widgets er anbragt vandret eller lodret, og standardretningen er vandret."vandret"
og"lodret"
er de eneste juridiske værdier, der kan tildeles denne attribut.layout_bredde
identificerer bredden af layoutet. Juridiske værdier inkluderer"fill_parent"
(at være så bred som forælderen) og"wrap_content"
(at være bred nok til at vedlægge indhold). (Noter detfyld_forælder
blev omdøbt tilmatch_parent
i Android 2.2, men er stadig understøttet og udbredt.)layout_højde
identificerer layoutets højde. Juridiske værdier inkluderer"fill_parent"
(at være lige så høj som forælderen) og"wrap_content"
(at være høj nok til at vedlægge indhold).tyngdekraft
identificerer, hvordan layoutet er placeret i forhold til skærmen. For eksempel,"centrum"
angiver, at layoutet skal centreres vandret og lodret på skærmen.baggrund
identificerer et baggrundsbillede, en gradient eller en solid farve. For enkelheds skyld har jeg hårdkodet en hexadecimal farveidentifikator for at betegne en solid hvid baggrund (#ffffff
). (Farver gemmes normalt ifarver.xml
og der henvises til fra denne fil.)
Det Lineær layout
element indkapsler ImageView
og Knap
elementer. Hvert af disse elementer specificerer en id
attribut, som identificerer elementet, så det kan henvises til fra kode. Det ressourceidentifikator (speciel syntaks, der begynder med @
) tildelt denne attribut begynder med @ + id
præfiks. For eksempel, @ + id / android
identificerer ImageView
element som Android
; dette element refereres fra kode ved at specificere R.id. Android
.
Disse elementer specificerer også layout_bredde
og layout_højde
attributter til bestemmelse af, hvordan deres indhold er lagt ud. Hver attribut tildeles wrap_content
så elementet vises i sin naturlige størrelse.
ImageView
angiver en layout_marginBundom
attribut for at identificere en mellemrumsseparator mellem sig selv og knappen, der følger lodret. Rummet er angivet som 10 dips, eller densitetsuafhængige pixels. Dette er virtuelle pixels, som apps kan bruge til at udtrykke layoutdimensioner / positioner på en skærmtæthedsuafhængig måde.
Densitetsuafhængige pixels
EN densitetsuafhængig pixel (dip) svarer til en fysisk pixel på en 160-dpi skærm, den baseline tæthed antages af Android. Under kørsel håndterer Android gennemsigtig enhver skalering af de nødvendige dip-enheder baseret på den faktiske tæthed af den anvendte skærm. Dypenheder konverteres til skærmpixels via ligningen: pixels = dips * (tæthed / 160). For eksempel på en 240-dpi skærm svarer 1 dip til 1,5 fysiske pixels. Google anbefaler at bruge dip-enheder til at definere din apps brugergrænseflade for at sikre korrekt visning af brugergrænsefladen på forskellige enhedsskærme.