Programmering

Android Studio til begyndere, del 2: Udforsk og kode appen

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 Friesen

Projektvinduet 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 W2Aer 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 navngivet R fordi dets indhold identificerer forskellige slags applikationsressourcer, herunder layout, billeder, strenge og farver.
  • layout er navnet på en klasse, der er indlejret i R. 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å en int-baseret konstant erklæret indeni layout. Dette ressource-id identificerer hovedlayoutressourcen. Specifikt vigtigste henviser til en main.xml fil, der gemmer hovedaktivitets layoutoplysninger. vigtigste er W2A'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 ImageViewer 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 ImageViewer 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 det fyld_forælder blev omdøbt til match_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 i farver.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.

Vælge og gemme et nyt layout