Android Studio за начинаещи, Част 2: Разгледайте и кодирайте приложението

Актуализирано: януари 2020 г.

В част 1 от това въведение за начинаещи за Android Studio, вие настроите Android Studio във вашата среда за разработка и се запознахте с потребителския интерфейс. Сега, в Част 2, ще кодирате първото си приложение.

Анимираното мобилно приложение се състои от една дейност, която представя персонажа на робота на Google за Android и бутон за анимиране на героя. Щракването върху бутона кара героя постепенно да променя цвета от зелен на червен на син, след това обратно към зелен. Въпреки че приложението не е особено полезно, писането му ще ви помогне да се почувствате комфортно при използването на Android Studio. В част 3 ще създадете и стартирате приложението, като използвате емулатор на устройство с Android и таблет Kindle Fire.

Имайте предвид, че тази серия е актуализирана за Android Studio 3.2.1, текущата стабилна версия към момента на писане.

Проекти и редактори на Android Studio за проекти и редактори

Въведох основния прозорец на Android Studio в края на част 1. Този прозорец е разделен на няколко области, включително прозорец на Project, където идентифицирате ресурсните файлове на приложението и различни прозорци на редактора, където ще напишете кода и ще посочите ресурси за мобилни приложения в Android Studio. Прозорецът на проекта и прозорецът на редактора са показани на фигура 1.

Джеф Фризън

Прозорецът Project откроява W2A , което е името на W2A.javaизходния файл на приложението (въпреки че .javaразширението на файла не е показано). Съответстващ на W2A е прозорец на редактора, до който се достига чрез двукратно щракване върху W2A в прозореца на проекта. Прозорецът на редактора разкрива текущото съдържание на файла, в този случай скелетния изходен код на Java за основната дейност на приложението.

Всеки прозорец на редактора е свързан с раздел. Например, W2A прозорец на редактора е свързано с W2A.java раздел. Показва се и втори раздел, идентифициран като main.xml (XML-оформлението по подразбиране за основната дейност на приложението). Преминавате от един прозорец на редактора в друг, като щракнете върху раздела на прозореца.

изтегляне Изтеглете кода Изтеглете изходния код за примерното приложение за Android: W2A.java. Създадено от Jeff Friesen за JavaWorld.

Примерното приложение за Android

Примерното приложение ( W2A.java ) се състои от основна дейност, която показва характера на робота на Android и бутон. Когато потребителят натисне бутона, роботът анимира през серия от цветове. В този раздел ще изследваме изходния код и ресурси на дейността.

Разгледайте и кодирайте примерното приложение за Android

Изходният код на дейността се съхранява във файла W2A.java, представен в листинг 1.

Листинг 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.javaфайла започва с изявление пакет , който имената на пакета ( ca.javajeff.w2a), който съхранява W2Aклас. Това е последвано от поредица от инструкции за импортиране за различни типове API на Android. След това кодът описва W2Aкласа, който се разширява android.app.Activity.

W2Aпърво декларира androidAnimationекземплярно поле от тип android.graphics.drawable.AnimationDrawable. Обектите от типа AnimationDrawableописват анимации кадър по кадър, при които текущото изтегляемо изображение се заменя със следващото в анимационната последователност.

Какво може да се изтегли?

А изтегляемото е нещо, което може да се направи, като например изображение. AnimationDrawableиндиректно разширява абстрактния android.graphics.drawable.Drawableклас, който е обща абстракция за изтегляем.

Методът onCreate ()

Цялата дейност на приложението се извършва в W2Aе висш onCreate(Bundle)метод: не са необходими никакви други методи, която помага да се запази това приложение просто.

onCreate(Bundle) първо извиква своя едноименен метод на суперклас, правило, което трябва да се спазва от всички заместващи методи на дейност.

След това този метод се изпълнява, за setContentView(R.layout.main)да установи потребителския интерфейс на приложението. R.layout.mainе идентификатор (ID) за ресурс на приложение, който се намира в отделен файл. Вие тълкувате този идентификатор по следния начин:

  • Rе името на клас, който се генерира при изграждането на приложението. Този клас е кръстен, Rзащото съдържанието му идентифицира различни видове ресурси на приложения, включително оформления, изображения, низове и цветове.
  • layoutе името на клас, който е вложен в R. Ресурс на приложение, чийто идентификатор се съхранява в този клас, описва специфичен ресурс за оформление. Всеки вид ресурс на приложение е свързан с вложен клас, който е именуван по подобен начин. Например stringидентифицира низ ресурси.
  • mainе името на intбазирана константа, декларирана в layout. Този идентификатор на ресурс идентифицира основния ресурс за оформление. По-конкретно се mainотнася до main.xmlфайл, който съхранява информацията за оформлението на основната дейност. mainе W2Aединственият ресурс за оформление.

Минавайки R.layout.mainда Activityе void setContentView(int layoutResID)метод инструктира Android, за да създадете потребителски интерфейс на екрана, като се използва информация за оформлението, съхранявани в main.xml. Зад кулисите Android създава компонентите на потребителския интерфейс, описани в, main.xmlи ги позиционира на екрана на устройството, както е посочено в main.xmlданните за оформлението на.

Екранът се основава на изгледи (абстракции на компоненти на потребителския интерфейс) и групи изгледи (изгледи, които групират свързани компоненти на потребителския интерфейс). Изгледите са екземпляри на класове, които подкласират android.view.Viewкласа и са аналогични на компонентите AWT / Swing. Изгледните групи са екземпляри на класове, които подкласират абстрактния android.view.ViewGroupклас и са аналогични на AWT / Swing контейнери. Android посочва конкретни изгледи (като бутони или въртящи се устройства) като приспособления .

Продължавайки, onCreate(Bundle)изпълнява ImageView androidImage = (ImageView) findViewById(R.id.android);. Това твърдение първите разговори Viewе View findViewById(int id)метод, за да откриете android.widget.ImageView, декларирани в елемент main.xmlи идентифициран като android. Той го инстанцира ImageViewи инициализира до стойностите, декларирани във main.xmlфайла. След това изявлението записва референцията на този обект в локална променлива androidImage.

ImageView и AnimationDrawable

След това androidImage.setBackgroundResource(R.drawable.android_animate);изразът извиква ImageViewнаследения (от View) void setBackgroundResource(int resID)метод, задавайки фона на изгледа на ресурса, идентифициран от resID. На R.drawable.android_animateидентифицира аргумент на XML файл с име android_animate.xml(представен по-късно), което съхранява данни на анимацията, и която се съхранява в resе drawableподдиректория. В setBackgroundResource()разговора свързва androidImageгледка към последователността на изображения, описани от android_animate.xml, който ще бъде изготвен от тази гледна точка. Първоначалното изображение се изчертава в резултат на извикването на този метод.

ImageView lets an app animate a sequence of drawables by calling AnimationDrawable methods. Before the app can do this, it must obtain ImageView's AnimationDrawable. The androidAnimation = (AnimationDrawable) androidImage.getBackground(); assignment statement that follows accomplishes this task by invoking ImageView's inherited (from View) Drawable getBackground() method. This method returns the AnimationDrawable for the given ImageView, which is subsequently assigned to the androidAnimation field. The AnimationDrawable instance is used to start and stop an animation, a process I'll describe shortly.

Finally, onCreate(Bundle) creates the Animate button. It invokes findByViewId(int) to obtain the button information from main.xml, then instantiates the android.widget.Button class.

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

Независим от плътност пиксел (dip) е еквивалентен на един физически пиксел на екран със 160 dpi, базовата плътност, приета от Android. По време на изпълнение, Android прозрачно обработва всяко мащабиране на необходимите потапящи единици, въз основа на действителната плътност на използвания екран. Потопените единици се преобразуват в пиксели на екрана чрез уравнението: пиксели = спадове * (плътност / 160) . Например, на 240-dpi екран, 1 dip е равен на 1,5 физически пиксела. Google препоръчва използването на dip модули за определяне на потребителския интерфейс на вашето приложение, за да се осигури правилното показване на потребителския интерфейс на различни екрани на устройства.

Избор и запазване на ново оформление