Android Studio dla początkujących, część 2: Eksploruj i koduj aplikację

Aktualizacja: styczeń 2020 r.

W części 1 tego wprowadzenia do Android Studio dla początkujących, skonfigurowałeś Android Studio w swoim środowisku programistycznym i poznałeś interfejs użytkownika. Teraz, w części 2, zakodujesz swoją pierwszą aplikację.

Animowana aplikacja mobilna składa się z jednej czynności, która przedstawia postać robota Google z systemem Android oraz przycisk do animowania postaci. Kliknięcie przycisku powoduje stopniową zmianę koloru postaci z zielonego na czerwony na niebieski, a następnie z powrotem na zielony. Chociaż aplikacja nie jest szczególnie przydatna, jej pisanie pomoże ci w zrozumieniu korzystania z Android Studio. W części 3 utworzysz i uruchomisz aplikację przy użyciu emulatora urządzenia z systemem Android i tabletu Kindle Fire.

Zauważ, że ta seria została zaktualizowana dla Android Studio 3.2.1, aktualnej stabilnej wersji w chwili pisania tego tekstu.

Projekt i okna edytora Android Studio

Przedstawiłem główne okno Android Studio na końcu części 1. To okno jest podzielone na kilka obszarów, w tym okno projektu, w którym identyfikujesz pliki zasobów aplikacji oraz różne okna edytora, w których piszesz kod i określasz zasoby dla aplikacji mobilnych w Android Studio. Okno projektu i okno edytora pokazano na rysunku 1.

Jeff Friesen

Okno projektu wyróżnia W2A , czyli nazwę W2A.javapliku źródłowego aplikacji (chociaż .javarozszerzenie pliku nie jest wyświetlane). Odpowiadające W2A jest okno edytora, dostępne po dwukrotnym kliknięciu W2A w oknie projektu. Okno edytora ujawnia aktualną zawartość pliku, w tym przypadku szkieletowy kod źródłowy Java dla głównej aktywności aplikacji.

Każde okno edytora jest powiązane z zakładką. Na przykład okno edytora W2A jest powiązane z zakładką W2A.java . Wyświetlana jest także druga zakładka oznaczona jako main.xml (domyślny układ oparty na języku XML dla głównej aktywności aplikacji). Przechodzisz z jednego okna edytora do drugiego, klikając jego kartę.

pobierz Pobierz kod Pobierz kod źródłowy przykładowej aplikacji na Androida: W2A.java. Stworzone przez Jeffa Friesena dla JavaWorld.

Przykładowa aplikacja na Androida

Przykładowa aplikacja ( W2A.java ) składa się z głównej czynności, która wyświetla postać robota Androida i przycisk. Gdy użytkownik naciśnie przycisk, robot animuje serię kolorów. W tej sekcji omówimy kod źródłowy działania i zasoby.

Poznaj i zakoduj przykładową aplikację na Androida

Kod źródłowy działania jest przechowywany w pliku W2A.java, przedstawionym na Listingu 1.

Listing 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.javaPlik rozpoczyna się stwierdzeniem paczki , których nazwy opakowaniu ( ca.javajeff.w2a), która przechowuje W2Aklasy. Następnie następuje seria instrukcji importu dla różnych typów interfejsu API systemu Android. Następnie kod opisuje W2Aklasę, która rozszerza android.app.Activity.

W2Anajpierw deklaruje androidAnimationpole instancji typu android.graphics.drawable.AnimationDrawable. Obiekty typu AnimationDrawableopisują animacje klatka po klatce, w których bieżący element rysunkowy jest zastępowany następnym rysunkiem w sekwencji animacji.

Co to jest rysowanie?

Odkształcalne jest coś, co można wyciągnąć, takich jak zdjęcia. AnimationDrawablepośrednio rozszerza android.graphics.drawable.Drawableklasę abstrakcyjną , która jest ogólną abstrakcją dla rysowalnego.

Metoda onCreate ()

Cała praca aplikacji odbywa się metodą W2Anadrzędną onCreate(Bundle): żadne inne metody nie są wymagane, co pomaga zachować prostotę aplikacji.

onCreate(Bundle) najpierw wywołuje metodę nadklasy o tej samej nazwie, regułę, której muszą przestrzegać wszystkie nadpisujące metody działania.

Ta metoda jest następnie wykonywana w setContentView(R.layout.main)celu ustanowienia interfejsu użytkownika aplikacji. R.layout.mainto identyfikator (identyfikator) zasobu aplikacji, który znajduje się w oddzielnym pliku. Interpretujesz ten identyfikator w następujący sposób:

  • Rto nazwa klasy, która jest generowana podczas tworzenia aplikacji. Ta klasa nosi nazwę, Rponieważ jej zawartość identyfikuje różne rodzaje zasobów aplikacji, w tym układy, obrazy, ciągi i kolory.
  • layoutto nazwa zagnieżdżonej klasy R. Zasób aplikacji, którego identyfikator jest przechowywany w tej klasie, opisuje określony zasób układu. Każdy rodzaj zasobu aplikacji jest powiązany z zagnieżdżoną klasą o podobnej nazwie. Na przykład stringidentyfikuje zasoby ciągów.
  • mainjest nazwą intstałej opartej na bazie zadeklarowanej wewnątrz layout. Ten identyfikator zasobu określa główny zasób układu. W szczególności mainodnosi się do main.xmlpliku, który przechowuje informacje o układzie głównego działania. mainto W2Ajedyny zasób dotyczący układu.

Przechodząc R.layout.maindo Activity„s void setContentView(int layoutResID)metody instruuje Android stworzyć ekran interfejsu użytkownika na podstawie informacji przechowywanych w układ main.xml. W tle system Android tworzy komponenty interfejsu użytkownika opisane w main.xmlsekcji i umieszcza je na ekranie urządzenia zgodnie z main.xmldanymi układu.

Ekran jest oparty na widokach (abstrakcji komponentów interfejsu użytkownika) i grupach widoków (widokach, które grupują powiązane komponenty interfejsu użytkownika). Widoki są instancjami klas, które stanowią podklasy android.view.Viewklasy i są analogiczne do komponentów AWT / Swing. Grupy widoków są instancjami klas, które stanowią podklasy android.view.ViewGroupklasy abstrakcyjnej i są analogiczne do kontenerów AWT / Swing. Android określa określone widoki (takie jak przyciski lub pokrętła) jako widżety .

Kontynuacja, onCreate(Bundle)wykonanie ImageView androidImage = (ImageView) findViewById(R.id.android);. Stwierdzenie to pierwsze rozmowy View„s View findViewById(int id)metoda, aby znaleźć android.widget.ImageViewelement, zadeklarowane w main.xmli zidentyfikowany jako android. Tworzy instancję ImageViewi inicjalizuje ją zgodnie z wartościami zadeklarowanymi w main.xmlpliku. Następnie instrukcja zapisuje odwołanie do tego obiektu w zmiennej lokalnej androidImage.

ImageView i AnimationDrawable

Następnie androidImage.setBackgroundResource(R.drawable.android_animate);instrukcja wywołuje metodę ImageViewinherited (from View) void setBackgroundResource(int resID), ustawiając tło widoku na zasób identyfikowany przez resID. W R.drawable.android_animateidentyfikuje argumentów plik XML o nazwie android_animate.xml(przedstawiony później), który przechowuje informacje na temat animacji, a które są przechowywane w res„s drawablepodkatalogu. setBackgroundResource()Wezwanie łączy androidImagewidok na sekwencji obrazów opisanych android_animate.xml, który zostanie sporządzony zgodnie z tym poglądem. Obraz początkowy jest rysowany w wyniku tego wywołania metody.

ImageViewpozwala aplikacji animować sekwencję drawables przez wywołanie AnimationDrawablemetod. Zanim aplikacja będzie mogła to zrobić, musi pobrać ImageViewplik AnimationDrawable. Poniższa androidAnimation = (AnimationDrawable) androidImage.getBackground();instrukcja przypisania wykonuje to zadanie przez wywołanie metody ImageViewinherited (from View) Drawable getBackground(). Ta metoda zwraca dane AnimationDrawabledla danego ImageView, które jest następnie przypisywane do androidAnimationpola. AnimationDrawableInstancji służy do włączania i wyłączania animacji, proces Opiszę krótko.

Na koniec onCreate(Bundle)tworzy przycisk Animacja . Wywołuje w findByViewId(int)celu uzyskania informacji o przycisku main.xml, a następnie tworzy instancję android.widget.Buttonklasy.

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

Pikseli niezależne od gęstości (DIP) jest równa jednej fizycznej piksela 160 dpi ekranu gęstość linii bazowej przejmuje Android. W czasie wykonywania system Android w przejrzysty sposób obsługuje skalowanie wymaganych jednostek zanurzenia w oparciu o rzeczywistą gęstość używanego ekranu. Jednostki zanurzeń są konwertowane na piksele ekranu za pomocą równania: piksele = spadki * (gęstość / 160) . Na przykład na ekranie o rozdzielczości 240 dpi 1 dip to 1,5 fizycznego piksela. Google zaleca używanie jednostek dip do definiowania interfejsu użytkownika aplikacji, aby zapewnić prawidłowe wyświetlanie interfejsu użytkownika na różnych ekranach urządzeń.

Wybór i zapisanie nowego układu