Android Studio za početnike, 2. dio: Istražite i kodirajte aplikaciju

Ažurirano: siječanj 2020.

U prvom dijelu ovog početničkog uvoda u Android Studio postavili ste Android Studio u svom razvojnom okruženju i upoznali korisničko sučelje. Sada ćete u 2. dijelu kodirati svoju prvu aplikaciju.

Animirana mobilna aplikacija sastoji se od jedne aktivnosti koja predstavlja Googleov lik Android robota i gumb za animiranje lika. Klikom na gumb dolazi do toga da lik postupno mijenja boju iz zelene u crvenu u plavu, a zatim se vraća u zelenu. Iako aplikacija nije posebno korisna, pisanjem će vam pomoći da se ugodno koristite Android Studiom. U 3. dijelu izradit ćete i pokrenuti aplikaciju pomoću emulatora Android uređaja i Kindle Fire tableta.

Imajte na umu da je ova serija ažurirana za Android Studio 3.2.1, trenutačno stabilno izdanje od ovog članka.

Prozori projekta i uređivača za Android Studio

Glavni prozor Android Studija predstavio sam na kraju 1. dijela. Taj je prozor podijeljen na nekoliko područja, uključujući prozor Projekta u kojem identificirate datoteke resursa aplikacije i razne prozore uređivača u koje ćete napisati kôd i odrediti resurse za mobilne aplikacije u Android Studiju. Prozor projekta i prozor uređivača prikazani su na slici 1.

Jeff Friesen

Prozor Project ističe W2A , što je naziv W2A.javaizvorne datoteke aplikacije (iako nastavak .javadatoteke nije prikazan). Odgovarajući na W2A je urednik prozor, doći dvoklikom W2A u prozoru Project. Prozor uređivača otkriva trenutni sadržaj datoteke, u ovom slučaju skeletni Java izvorni kôd za glavnu aktivnost aplikacije.

Svaki je prozor uređivača povezan s karticom. Na primjer, prozor uređivača W2A povezan je s karticom W2A.java . Prikazana je i druga kartica identificirana kao main.xml (zadani izgled zasnovan na XML-u za glavnu aktivnost aplikacije). Prelazite iz jednog prozora uređivača u drugi klikom na karticu prozora.

preuzimanje Preuzmite kod Preuzmite izvorni kôd za primjer Android aplikacije: W2A.java. Stvorio Jeff Friesen za JavaWorld.

Primjer za Android

Primjer aplikacije ( W2A.java ) sastoji se od glavne aktivnosti koja prikazuje lik Android robota i gumb. Kad korisnik pritisne gumb, robot animira kroz niz boja. U ovom ćemo odjeljku istražiti izvorni kod i resurse aktivnosti.

Istražite i kodirajte Android primjer aplikacije

Izvorni kod aktivnosti pohranjen je u datoteci koja je W2A.javapredstavljena na popisu 1.

Popis 1. W2A.java

 package ca.javajeff.w2a; import android.app.Activity; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; public class W2A extends Activity { 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); } } 

W2A.javaDatoteka počinje s izjavom paket , koji imenuje paket ( ca.javajeff.w2a) koja pohranjuje W2Aklase. Nakon toga slijedi niz izjava o uvozu za različite vrste Android API-ja. Dalje, kôd opisuje W2Aklasu koja se proširuje android.app.Activity.

W2Aprvo deklarira androidAnimationpolje instance tipa android.graphics.drawable.AnimationDrawable. Objekti tipa AnimationDrawableopisuju sličice po sličicama, u kojima se trenutni crtaći zamjenjuje sljedećim crtanim u nizu animacija.

Što se može crtati?

Crtanja je nešto što se može izvući, kao što je na slici. AnimationDrawableneizravno proširuje apstraktnu android.graphics.drawable.Drawableklasu, što je općenita apstrakcija za crtane.

Metoda onCreate ()

Sav rad aplikacije odvija se W2Anadređenom onCreate(Bundle)metodom: nisu potrebne druge metode, što pomaže da ova aplikacija bude jednostavna.

onCreate(Bundle) prvo poziva svoju istoimenu metodu superklase, pravilo koje moraju slijediti sve nadmoćne metode aktivnosti.

Zatim se ova metoda izvršava setContentView(R.layout.main)za uspostavljanje korisničkog sučelja aplikacije. R.layout.mainje identifikator (ID) za resurs aplikacije koji se nalazi u zasebnoj datoteci. Ovaj ID tumačite na sljedeći način:

  • Rje naziv klase koja se generira prilikom izrade aplikacije. Ova je klasa imenovana Rjer njezin sadržaj identificira različite vrste resursa aplikacije, uključujući izglede, slike, nizove i boje.
  • layoutje naziv klase koja je ugniježđena unutar R. Resurs aplikacije čiji je ID pohranjen u ovoj klasi opisuje određeni resurs izgleda. Svaka vrsta aplikacijskog resursa povezana je s ugniježđenom klasom koja je imenovana na sličan način. Na primjer, stringidentificira resurse niza.
  • mainje naziv intkonstante na temelju deklarirane unutar layout. Ovaj ID resursa identificira glavni resurs izgleda. Točnije, mainodnosi se na main.xmldatoteku koja pohranjuje informacije o rasporedu glavne aktivnosti. mainje W2Ajedini izvor izgleda.

Metoda prelaska R.layout.mainna Activity'' void setContentView(int layoutResID)nalaže Androidu da kreira zaslon korisničkog sučelja koristeći podatke o rasporedu pohranjene u main.xml. Iza kulisa, Android stvara komponente korisničkog sučelja opisane u main.xmli postavlja ih na zaslon uređaja kako je određeno main.xmlpodacima o rasporedu.

Zaslon se temelji na prikazima (apstrakcije komponenata korisničkog sučelja) i grupama prikaza (prikazi koji grupiraju povezane komponente korisničkog sučelja). Pogledi su primjerci klasa koje potklasiraju android.view.Viewklasu i analogni su komponentama AWT / Swing. Grupe prikaza su primjerci klasa koji potklasiraju apstraktnu android.view.ViewGroupklasu i analogni su AWT / Swing spremnicima. Android se na određene prikaze (poput gumba ili okretača) odnosi kao na widgete .

Nastavak, onCreate(Bundle)izvršava ImageView androidImage = (ImageView) findViewById(R.id.android);. Ova izjava Prvi pozivi View„s View findViewById(int id)metodu za pronalaženje android.widget.ImageViewelementa iskazane u main.xmli identificiran kao android. Instancira ga ImageViewi inicijalizira na vrijednosti deklarirane u main.xmldatoteci. Izjava tada sprema referencu ovog objekta u lokalnu varijablu androidImage.

ImageView i AnimationDrawable

Dalje, androidImage.setBackgroundResource(R.drawable.android_animate);izraz poziva ImageViewna naslijeđenu (od View) void setBackgroundResource(int resID)metodu, postavljajući pozadinu pogleda na resurs identificiran pomoću resID. Na R.drawable.android_animateargument identificira XML datoteka po imenu android_animate.xml(predstavljen kasnije), koji pohranjuje informacije o animacije, a koji je spremljen u res„s drawablepoddirektorij. setBackgroundResource()Poziv povezuje androidImagepogled na slijed slika koje je opisao android_animate.xml, koji će biti izvučeni na ovom prikazu. Početna slika crta se kao rezultat poziva ove metode.

ImageViewomogućava aplikaciji animiranje niza crtanih elemenata pozivanjem AnimationDrawablemetoda. Da bi aplikacija to mogla učiniti, mora nabaviti ImageView's AnimationDrawable. Izraz androidAnimation = (AnimationDrawable) androidImage.getBackground();dodjele koji slijedi izvršava ovaj zadatak pozivajući se ImageViewna naslijeđenu (od View) Drawable getBackground()metodu. Ova metoda vraća podatak AnimationDrawableza dano ImageView, koji je naknadno dodijeljen androidAnimationpolju. AnimationDrawablePrimjer koristi se za pokretanje i zaustavljanje animacije, proces ću ukratko opisati.

Konačno, onCreate(Bundle)stvara gumb Animate . Poziva findByViewId(int)za dobivanje podataka o gumbu main.xml, a zatim instancira android.widget.Buttonklasu.

It then employs the View class's nested onClickListener interface to create a listener object. This object's void onClick(View v) method is invoked whenever the user clicks the button. The listener is registered with its Button object by calling View's void setOnClickListener(AdapterView.OnClickListener listener) method.

To stop, then start the animation, Animate's click listener invokes androidAnimation.stop(); followed by androidAnimation.start();. The stop() method is called before start() to ensure that a subsequent click of the Animate button causes a new animation to begin.

Update and save your code

Before we continue, replace the skeletal code in your W2A.java tab with the code from Listing 1. Save the contents of this window by pressing Ctrl+S, or select Save All from the File menu.

Coding the Android app's main.xml

The app's main activity is associated with an XML-based layout, which is stored in file main.xml, and which is presented in Listing 2.

Listing 2. main.xml

After the XML declaration, Listing 2 declares a LinearLayout element that specifies a layout (a view group that arranges contained views on an Android device's screen in some manner) for arranging contained widgets (including nested layouts) either horizontally or vertically across the screen.

The tag specifies several attributes for controlling this linear layout. These attributes include the following:

  • orientation identifies the linear layout as horizontal or vertical. Contained widgets are laid out horizontally or vertically, and the default orientation is horizontal. "horizontal" and "vertical" are the only legal values that can be assigned to this attribute.
  • layout_width identifies the width of the layout. Legal values include "fill_parent" (to be as wide as the parent) and "wrap_content" (to be wide enough to enclose content). (Note that fill_parent was renamed to match_parent in Android 2.2, but is still supported and widely used.)
  • layout_height identifies the height of the layout. Legal values include "fill_parent" (to be as tall as the parent) and "wrap_content" (to be tall enough to enclose content).
  • gravity identifies how the layout is positioned relative to the screen. For example, "center" specifies that the layout should be centered horizontally and vertically on the screen.
  • background identifies a background image, a gradient, or a solid color. For simplicity, I've hardcoded a hexadecimal color identifier to signify a solid white background (#ffffff). (Colors would normally be stored in colors.xml and referenced from this file.)

The LinearLayout element encapsulates ImageView and Button elements. Each of these elements specifies an id attribute, which identifies the element so that it can be referenced from code. The resource identifier (special syntax that begins with @) assigned to this attribute begins with the @+id prefix. For example, @+id/android identifies the ImageView element as android; this element is referenced from code by specifying R.id.android.

These elements also specify layout_width and layout_height attributes for determining how their content is laid out. Each attribute is assigned wrap_content so that the element will appear at its natural size.

ImageView specifies a layout_marginBottom attribute to identify a space separator between itself and the button that follows vertically. The space is specified as 10 dips, or density-independent pixels. These are virtual pixels that apps can use to express layout dimensions/positions in a screen density-independent way.

Density-independent pixels

Gustoća neovisan piksela (DIP) je ekvivalent jednom fizičkom piksela na 160 tpi zaslon, polazna gustoća preuzela Android. Tijekom izvođenja, Android transparentno obrađuje svako skaliranje potrebnih jedinica za umakanje, na temelju stvarne gustoće zaslona koji se koristi. Jedinice dip pretvaraju se u piksele zaslona pomoću jednadžbe: pikseli = padovi * (gustoća / 160) . Na primjer, na zaslonu s 240 dpi, 1 pad jednak je 1,5 fizičkih piksela. Google preporučuje upotrebu dip jedinica za definiranje korisničkog sučelja vaše aplikacije kako bi se osigurao pravilan prikaz korisničkog sučelja na različitim zaslonima uređaja.

Odabir i spremanje novog izgleda