Изучение общей структуры Android-приложения. Режимы Design и Text
Рассмотрим открытое рабочее окно проекта и изучим состав готового проекта. Раскрывайте папки проекта и файлы, используя четвертую сверху строку меню и окно структуры приложения (крайнее справа на рабочем поле среды).
Вкладка Project содержит две основные папки: app и Gradle Scripts. Папка app содержит все необходимые файлы приложения - код, ресурсы картинок и т.п. Вторая папка служит для различных настроек, управления проектом и других вспомогательных действий.
В папке app находятся три папки: manifests, javaи res. Рассмотрим их содержимое более подробно.
manifest.Вкладка manifestсодержит в себе единственный файл манифеста приложения по имени AndroidManifest.xml. Часть настроек из манифеста в студии была перенесена в Gradle. В этом файле регистрируются ключевые элементы программы - все активности, службы, приёмники и контент-провайдеры приложения. Например, если создается приложение из 2-х активностей, то 1-я будет помещена в манифест по умолчанию, а вторую придется там зарегистрировать самому разработчику. Также манифест должен содержать требуемые приложению разрешения - например, разрешение на доступ к сети. В файле «AndroidManifest.xml» излагается как бы план развертывания Android-приложения.
java.Данная папка содержит две подпапки - рабочая и для тестов. Рабочая папка имеет название пакета и содержит файлы классов. В настоящем проекте там содержится один класс MainActivity.
res.Папка res содержит файлы ресурсов, которые разложены на отдельные подпапки: drawable,layout, menu, values. Рассмотрим их содержимое.
- drawableсодержит графические файлы, изображения, т.е. графические ресурсы, предназначенные для разных размеров экрана..
- layoutвключает xml-файлы разметки, хранящие настройки внешнего вида форм и различных элементов форм (наличие и положение кнопок, текстовых полей, переключателей и т.д.). После создания проекта там уже имеется файл activity_main.xml, который отвечает за внешний вид главного окна приложения.
- menu- содержит xml-файл, который описывает контент кнопки меню приложения – после нажатия кнопку меню в программе появляется выпадающий список функций для выбора. Этот список формируется в файле main.xml, который находится в папке menu.
- value- содержит в себе различные ресурсы, типа: строковых ресурсов, стилей, цветов, измерений, которые могут быть использованы в проекте.
В крайней левой части рабочего поля Студии находится окно, в котором графически показана структура приложения. В рассматриваемом примере оно имеет вид, показанный на рис.1.11. Правее находится Палитра (Palette) – набор функций для изменения свойств и содержимого проекта (рис.1.12).
Рис.1.11. Окно структуры приложения Рис.1.12. Окно Palette
Панель Palette предназначена для создания таких элементов интерфейса программ, как кнопки, переключатели, цвета, фон и др. Особое значение имеют две кнопки внизу данной панелиDesignи Text. Они позволяют переключаться между режимами
В режиме Designвсе действия с приложением выполняются визуально путем перетаскивания нужных элементов с панели на поле формы приложения. При этом необходимый элемент автоматически генерируется на форме и ему задаются по умолчанию некоторые свойства.
В режиме Textаналогичные действия выполняются программно путем ввода программного кода. При помощи ввода программного кода удобно изменять или заново задавать свойства элементов управления, а также выполнять другие действия. У каждого рассмотренного режима есть свои достоинства, поэтому необходимо использовать их оба.
Файл AndroidManifest.xml
Для раскрытия текстового содержимого файла необходимо дважды щелкнуть по пункту с его именем в строке над рабочей областью. Текст имеет следующий вид (рис.1.13):
Рис.1.13. Текст файла AndroidManifest.xml
В первом теге указан номер версии XML, кодировка символов.
Корневым элементом манифеста является <manifest>. В его первых строках указаны следующие данные:
xmlns:android определяет пространство имен Android,
package определяет уникальное имя пакета приложения.
Также могут использоваться элементы:
android:versionCode указывает на внутренний номер версии.
android:versionName указывает номер пользовательской версии.
Помимо корневого элемента <manifest> обязательным элементом манифеста является его дочерний тег <application> . В манифесте может быть только один такой элемент. Он может содержать в себе множество других дочерних элементов (<activity>, <service>, <receiver>, <provider> и другие), которые определяют структуру и работу приложения. Порядок расположения этих элементов, находящихся на одном уровне, произвольный. Все значения устанавливаются через атрибуты элементов. Кроме обязательных элементов, упомянутых выше, в манифесте по мере необходимости используются другие элементы. Перечислим значения некоторых из них в Android:
android:allowBackup - разрешение на резервное копирование,
android:icon– обозначение рисунка,
android:label– содержание строки и др.
Внутри тега <application> также должен быть хотя бы один элемент <activity>, в котором указываются программное имя активности (действия), имя приложения.
Файл activity_main.xml
Для раскрытия текстового содержимого файла activity_main.xml необходимо дважды щелкнуть по пункту с его именем в строке над рабочей областью. Смотреть его можно в двух режимах - Design и Text. Надо открыть в режиме Text - нажать кнопку внизу окна. Текст файла имеет следующий вид (рис.1.14):
Рис.1.14. Текст файла activity_main.xml
В первых двух строках указан номер версии XML, кодировка символов.
Корневым элементом является макет приложения типа <RelativeLayout>. В его первых строках указаны следующие данные:
xmlns:android определяет пространство имен Android,
xmlns:tools - пространство имен используемых программных приложений,
android:layout_width=”match_parent ”-ширина изображаемого объекта (match_parent - на полный размер родительского элемента в котором он прописан),
android:layout_ height =”match_parent ”-высота изображаемого объекта,
android:paddingLeft =”16dp”– размер отступа слева,
android:paddingRight =”16dp”– размер отступа справа,
android:paddingTop =”16dp”– размер отступа сверху,
android:paddingBottom =”16dp”– размер отступа снизу,
android:paddingLeft =”16dp”– размер отступа слева,
Файл MainActivity.java
Данный файл автоматически сгенерирован Студией и содержит пакет с кодом приложения, в том числе – текст класса на языке Java, который управляет работой главной активности приложения.
После щелчка по его названию откроется следующий код:
package com.example.misis.myapplication;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Проанализируем данный программный код. Название пакета и подключаемые библиотеки стандартны.
Рассмотрим класс public class MainActivity.
Итак, для начала теор. минимума достаточно, давайте наконец то создадим наш Hellow World! Чтобы привнести в стандартный вид приложения свою новизну, индивидуальность и оригинальность, давайте в режиме визуального редактирования с помощью мышки перетащим находящийся там элемент TextViewс текстом "Hellow World!" (выделяем надпись "Hellow World!" кликом и тащим куда надо) в центр экрана, потом зайдем в режим редактирования кода Textи в коде, описывающем наш текстовый элемент, допишем строчку с командой изменения размера текста (нижняя строчка в коде, отделенная пробелом):
<TextView
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="183dp"
android:textSize="25pt"/>
Уже в окошке Previewв можете видеть изменение размера текста.
Наше приложение готово! Осталось его протестировать и создать APK файл, чтобы показать наше творение всем, кому только можно. Настраиваем запуск либо эмулятора, либо реального устройства (как это сделать, смотрим тут) и нажимаем зеленую кнопку Run, либо на панели вверху Run --- Run "app", либо жмем Shift + F10. Дожидаемся загрузки эмулятора/установки приложения на телефон и смотрим на результат. Поздравляю, ваше первое Android приложение создано!
Рассмотрим программный код созданного приложения. Сначала изучим activity_main.xml. Смотреть его можно в двух режимах - Design и Text.
Откройте в режиме Text.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
Если смотреть на монитор, то у компонента вместо строчки android:text="@string/hello_world" вы можете увидеть строчку android:text="Hello World!". Однако, если подвести курсор мыши к тексту “Hello World!”, то увидите подсказку. Более того, если щёлкнуть по слову, то увидите реальный код, который скрывается за словами. Это относится и к другим параметрам, которые окрашены в салатовый прямоугольник, например, 16dp. Т.е. студия автоматически извлекает значения из ресурсов и подставляет их в код, чтобы программисту не приходилось вспоминать, что скрывается за кодом @string/hello_world. Комбинация клавиш Ctrl + - (минус) свернёт обратно.
Рассмотрим XML-код. В состав проекта входит специальный контейнер RelativeLayout, в котором размещён компонент TextView, предназначенный для вывода текста. Сам текст берётся из ресурсов, в данном случае из строкового ресурса hello_world. Он находится в файле res/values/strings.xml.
Рассмотрим Java-код (MainActivity.java)
package ru.alexanderklimov.helloworld;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Перед вами открыт файл класса, где имя класса MainActivity совпадает с именем файла с расширением java (это правило установлено языком Java). В первой строке идет название пакета - его мы задавали при создании проекта (Package Name). Далее идут строки импорта необходимых классов для проекта. Для экономии места они свёрнуты в одну группу. Разверните её. Если имена классов выводятся серым цветом, значит они не используются в проекте (подсказка Unused import statement) и можете спокойно удалить лишние строки.
Далее идёт объявление самого класса, который наследуется (extends) от абстрактного класса Activity. Это базовый класс для всех экранов приложения. Не исключено, что у вас будет ActionBarActivity, если при создании проекта вы оставили поддержку старых устройств. Если помните, я выбрал минимальную версию Android 4.1. В старых версиях не было плюшек, которые появились после Android 4, поэтому для них была создана специальная библиотека совместимости, которая позволяет использовать новинки от новых версий Android в старых программах. Класс ActionBarActivity как раз и относится к библиотеке совместимости. Считайте её бедным родственником базовой Activity. У неё есть все нужные методы и вспомогательные классы, но названия могут немного различаться. И смешивать названия нельзя. Если уж используете класс из библиотеки совместимости, то методы берите соответствующие.
В самом классе мы видим метод onCreate() – он вызывается, когда приложение создаёт и отображает разметку активности. Разберём код метода.
Строка super.onCreate(savedInstanceState); – это конструктор родительского класса, выполняющий необходимые операции для работы активности. Эту строчку вам не придётся трогать, оставляйте без изменений.
Вторая строчка setContentView(R.layout.activity_main); представляет больший интерес. Метод setContentView(int) подключает содержимое из файла разметки. В качестве аргумента мы указываем имя файла без расширения из папки res/layout. По умолчанию проект создаёт в нём файл activity_main.xml. Вы можете переименовать файл или создать свой файл с именем cat.xml и подключить его к своей активности. Тогда код будет выглядеть так:
setContentView(R.layout.cat);
Далее идут два метода, связанные с меню. Позже мы будем учиться создавать меню самостоятельно и эти заготовки нам пригодятся. Пока вы можете просто нажать на три вертикальные точки в верхней части приложения, чтобы увидеть пункт меню Settings.