Создание GUI
Семинар № 1
vk.com/android_seminar
Разработка мобильных приложений
на платформе Google Android
План
 компоненты Android-приложения, структура проекта,
ресурсы, файл R.java, манифест
 создание и работа с экранной формой (activity): XML-
разметка, Java-класс
 компоновки, их типы
 текстовые поля (TextView): создание, настройка и
оформление
 кнопки (Button) и способы обработки нажатия на них
 добавление новых activity и их отображение
 всплывающие сообщения
2
План
3
Специфика Android
 Платформа Android предоставляет богатый
набор средств (фреймворк) для разработки
приложений для мобильных устройств
 Приложение может иметь несколько «точек
входа» (экранных форм, сервисов). Из одного
компонента можно запустить другой (используя
сообщение-Intent)
 Можно запустить любой компонент любого
приложения, если имеются разрешения на это
 Платформа андроид предоставляет адаптивный
фреймворк, позволяющий загружать различные
ресурсы для разных конфигураций устройств
(разные компоновки для разных разрешений
экрана и т.п.)
4
Состав приложения
Activities
(экранные формы)
Content Providers
(поставщики данных)
Intents
(события)
Services
(службы)
Android-
приложение
5
Основные компоненты
приложения
 Activity – экранные формы
 Intent – сообщения о событиях в системе
 Content Provider – поставщики данных
 Service – службы (фоновые процессы)
 Broadcast Receiver – приёмники
широковещательных сообщений
6
Структура проекта
приложения
 java-классы, размещённые в пакетах –
функциональность приложения, слой
бизнес-логики
 ресурсы (файлы XML) – компоновки,
строки, изображения, стили –
презентационный слой приложения
7
Ресурсы приложения
 res/drawable-xx – для хранения изображений
для различных разрешений экрана
(drawable-hdpi, drawable-ldpi, drawable-mdpi и
т.п.)
 res/layout/ - для XML-файлов компоновки
графических форм
 res/menu/ - для XML-файлов меню
 res/values/ - для строковых ресурсов,
массивов и т.п.
 res/xml – для прочих XML-файлов
8
Activity
 Экранная форма, графическое окно
 видимая часть приложения
 на ней расположены элементы графического
интерфейса пользователя (GUI)
Например:
 список контактов
 окно дозвона
 форма настройки будильника
9
Activity
 Приложение может содержать несколько
экранных форм
 Одна из форм определяется как «главная» и
отображается при первом запуске приложения
 Activity одного приложения независимы друг от
друга
 одно приложение может открыть activity из
другого приложения, если у него есть
соответствующие разрешения
10
Что нужно для создания Activity
 создать java-класс формы, наследующий от
класса Activity
 зарегистрировать его в манифесте
приложения
 создать XML-файл ресурса компоновки
формы, содержащий описание графических
элементов управления (необязательно, т.к.
виджеты могут быть созданы динамически в
коде класса окна)
11
Java-класс активности
 наследует от Activity или его производных классов
(ActionBarActivity и т.п.)
 должен реализовывать метод onCreate, вызываемый
автоматически при создании экранной формы
 в этом методе вызывается setContentView,
устанавливающий ресурс компоновки (расположения
графических элементов) экранной формы
12
package com.example.firstapp;
import android.app.Activity;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Манифест приложения
 Файл AndroidManifest.xml в корневой папке
проекта
 содержит настройки конфигурации
приложения:
 объявляет компоненты (экранные формы,
поставщики данных и т.п.)
 перечисляет используемые библиотеки
 объявляет разрешения, требуемые для
работы программы (доступ к базе контактов,
отправка SMS и т.п.)
13
Класс View
 базовый класс для всех компонентов
пользовательского интерфейса
 Определяет прямоугольную область экрана,
отвечает за прорисовку изображения и
обработку событий
14
Связь View и ViewGroup
 Классы, наследующие ViewGroup, являются
контейнерами для компонентов,
наследующих от View
15
Иерархия классов Android SDK
16
2 способа создания виджетов
 XML-файл компоновки – содержит описание
графических элементов и их характеристик
 динамическое создание виджетов в
программном коде класса экранной формы
Предпочтительным является 1-й способ, он
позволяет отделить логику и внешний вид
программы
17
Файл R.java
 используется для идентификации ресурсов
 генерируется автоматически каждый раз при
изменении в файлах ресурсов
 статический окончательный класс (final static)
 содержит набор внутренних классов для
обращения к ID ресурсов различных типов
 drawable, layout, string, id и т.п.
18
Файл R.java
19
public final class R {
public static final class anim {
public static final int abc_fade_in=0x7f040000;
….
}
public static final class drawable {
public static final int abc_ab_bottom_solid_dark_holo=0x7f020000;
….
}
public static final class string {
public static final int my_act_title = 0x7f0a0001;
}
public static final class layout {
public static final int main= 0x7f030000;
}
…
}
Компоновки (разметки)
 задают расположение графических
компонентов на экране мобильного
устройства
 являются корневым элементом экранной
формы
 могут быть вложены в другие контейнеры
(ViewGroup)
 хранятся в виде XML-файла в
папке /res/layout
 позволяют отделить код от дизайна, как это
принято во многих технологиях (HTML и CSS,
Visual Studio и т.п.)
20
Файл компоновки
21
<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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.firstapp.MainActivity" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
Типы компоновок
 FrameLayout
 LinearLayout – размещение элементов
в одну линию вертикально или
горизонтально
 Vertical
 Horizontal
 TableLayout – размещение элементов в
ячейках таблицы
 GridLayout
 RelativeLayout – свободное
размещение элементов с
возможностью привязки относительно
границ экрана или других элементов
22
LinearLayout
23
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:orientation="vertical" >
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/to" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/subject" />
<EditText
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="top"
android:hint="@string/message" />
<Button
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="@string/send" />
</LinearLayout>
RelativeLayout
24
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="16dp"
android:paddingRight="16dp" >
<EditText
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/reminder" />
<Spinner
android:id="@+id/dates"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_below="@id/name"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@+id/times" />
<Spinner
android:id="@id/times"
android:layout_width="96dp"
android:layout_height="wrap_content"
android:layout_below="@id/name"
android:layout_alignParentRight="true" />
<Button
android:layout_width="96dp"
android:layout_height="wrap_content"
android:layout_below="@id/times"
android:layout_alignParentRight="true"
android:text="@string/done" />
</RelativeLayout>
Графические элементы
управления (виджеты)
25
Текстовые поля (TextView)
 Предназначены для отображения
статического текста
 Внешний вид может быть изменён с
помощью свойств и стилей (размер и цвет
шрифта, фон и т.п.)
 Могут содержать HTML-теги
 Могут реагировать на нажатие (click)
 Имя класса и XML-тега – TextView
 метод-геттер для получения текста –
textView1.getText()
 метод-сеттер для установки значения –
textView1.setText()
26
Работа с TextView
 XML-разметка
27
<TextView
android:id="@+id/text_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:capitalize="characters"
android:text="@string/hello_world" />
 Код в классе экранной формы (activity)
TextView txtView = (TextView) findViewById(R.id.text_id);
final String Label = txtView.getText().toString();
Оформление TextView
 использование атрибутов:
28
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#00FF00"
android:typeface="monospace"
android:text="@string/hello" />
Оформление TextView
29
 использование ресурсов стилей:
 создать файл в папке res/values/
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CodeFont" parent="@android:style/TextAppearance.Medium">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textColor">#00FF00</item>
<item name="android:typeface">monospace</item>
</style>
</resources>
<TextView
style="@style/CodeFont"
android:text="@string/hello" />
 привязка стиля с помощью атрибута в разметке:
Кнопки (Button)
 Позволяют выполнять действия при нажатии на них
пользователем
 Могут содержать текст и/или изображения
 Внешний вид может быть изменён путём настройки
свойств и стилей
30
XML-разметка кнопок
 с текстом
31
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_text"
... />
<ImageButton
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/button_icon"
... />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_text"
android:drawableLeft="@drawable/button_icon"
... />
 с иконкой
 с текстом и
иконкой
Методика работы с
графическими компонентами
 создать XML-разметку элемента в файле компоновки
32
<Button
android:id="@+id/button1"
android:text="@string/button_text"/>
import android.widget.Button;
……
Button btnStartPlay;
btnStartPlay = (Button)findViewById(R.id.button1);
 привязать компонент к переменной по идентификатору с помощью
метода findViewById и класса ресурсов R.id
 объявить переменную соответствующего типа в классе
экранной формы (activity)
(Требуется импорт класса компонента)
Обработчики нажатия на кнопку
1. Использование XML-атрибута onClick
2. Реализация интерфейса OnClickListener
классом экранной формы (activity)
3. Установка обработчика методом
setOnClickListener и создание анонимного
класса
33
Атрибут onClick
 В XML-разметке
34
<Button
android:id="@+id/button_send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_send"
android:onClick="sendMessage" />
/** Вызывается когда юзер нажимает на кнопку */
public void sendMessage(View view) {
// выполнение действий
}
 В коде класса формы
 Требования к методу:
 общедоступный (public)
 возвращает void
 принимает один параметр типа View
Открытие экранной формы
(activity)
 Осуществляется с помощью системного
сообщения о событии – Intent и метода
startActivity
35
public void openNewActivity(View view) {
Intent intent = new Intent(this, DisplayMessageActivity.class);
startActivity(intent);
}
Отображение
всплывающих
сообщений
36
Context context = getApplicationContext();
CharSequence text = "Я всплыло!";
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, text, duration);
toast.show();
Toast.makeText(context, text, duration).show();
Поля для ввода (EditText)
 позволяют пользователю вводить
информацию различного типа (имена,
номера телефонов, адреса и т.п.)
 поддерживают маскированный ввод для
фильтрации вводимых символов
 могут быть однострочными или
многострочными
 при нажатии на поле отображается экранная
клавиатура
37

Создание графического интерфейса пользователя мобильных Android приложений (часть 1)

  • 1.
    Создание GUI Семинар №1 vk.com/android_seminar Разработка мобильных приложений на платформе Google Android
  • 2.
    План  компоненты Android-приложения,структура проекта, ресурсы, файл R.java, манифест  создание и работа с экранной формой (activity): XML- разметка, Java-класс  компоновки, их типы  текстовые поля (TextView): создание, настройка и оформление  кнопки (Button) и способы обработки нажатия на них  добавление новых activity и их отображение  всплывающие сообщения 2
  • 3.
  • 4.
    Специфика Android  ПлатформаAndroid предоставляет богатый набор средств (фреймворк) для разработки приложений для мобильных устройств  Приложение может иметь несколько «точек входа» (экранных форм, сервисов). Из одного компонента можно запустить другой (используя сообщение-Intent)  Можно запустить любой компонент любого приложения, если имеются разрешения на это  Платформа андроид предоставляет адаптивный фреймворк, позволяющий загружать различные ресурсы для разных конфигураций устройств (разные компоновки для разных разрешений экрана и т.п.) 4
  • 5.
    Состав приложения Activities (экранные формы) ContentProviders (поставщики данных) Intents (события) Services (службы) Android- приложение 5
  • 6.
    Основные компоненты приложения  Activity– экранные формы  Intent – сообщения о событиях в системе  Content Provider – поставщики данных  Service – службы (фоновые процессы)  Broadcast Receiver – приёмники широковещательных сообщений 6
  • 7.
    Структура проекта приложения  java-классы,размещённые в пакетах – функциональность приложения, слой бизнес-логики  ресурсы (файлы XML) – компоновки, строки, изображения, стили – презентационный слой приложения 7
  • 8.
    Ресурсы приложения  res/drawable-xx– для хранения изображений для различных разрешений экрана (drawable-hdpi, drawable-ldpi, drawable-mdpi и т.п.)  res/layout/ - для XML-файлов компоновки графических форм  res/menu/ - для XML-файлов меню  res/values/ - для строковых ресурсов, массивов и т.п.  res/xml – для прочих XML-файлов 8
  • 9.
    Activity  Экранная форма,графическое окно  видимая часть приложения  на ней расположены элементы графического интерфейса пользователя (GUI) Например:  список контактов  окно дозвона  форма настройки будильника 9
  • 10.
    Activity  Приложение можетсодержать несколько экранных форм  Одна из форм определяется как «главная» и отображается при первом запуске приложения  Activity одного приложения независимы друг от друга  одно приложение может открыть activity из другого приложения, если у него есть соответствующие разрешения 10
  • 11.
    Что нужно длясоздания Activity  создать java-класс формы, наследующий от класса Activity  зарегистрировать его в манифесте приложения  создать XML-файл ресурса компоновки формы, содержащий описание графических элементов управления (необязательно, т.к. виджеты могут быть созданы динамически в коде класса окна) 11
  • 12.
    Java-класс активности  наследуетот Activity или его производных классов (ActionBarActivity и т.п.)  должен реализовывать метод onCreate, вызываемый автоматически при создании экранной формы  в этом методе вызывается setContentView, устанавливающий ресурс компоновки (расположения графических элементов) экранной формы 12 package com.example.firstapp; import android.app.Activity; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
  • 13.
    Манифест приложения  ФайлAndroidManifest.xml в корневой папке проекта  содержит настройки конфигурации приложения:  объявляет компоненты (экранные формы, поставщики данных и т.п.)  перечисляет используемые библиотеки  объявляет разрешения, требуемые для работы программы (доступ к базе контактов, отправка SMS и т.п.) 13
  • 14.
    Класс View  базовыйкласс для всех компонентов пользовательского интерфейса  Определяет прямоугольную область экрана, отвечает за прорисовку изображения и обработку событий 14
  • 15.
    Связь View иViewGroup  Классы, наследующие ViewGroup, являются контейнерами для компонентов, наследующих от View 15
  • 16.
  • 17.
    2 способа созданиявиджетов  XML-файл компоновки – содержит описание графических элементов и их характеристик  динамическое создание виджетов в программном коде класса экранной формы Предпочтительным является 1-й способ, он позволяет отделить логику и внешний вид программы 17
  • 18.
    Файл R.java  используетсядля идентификации ресурсов  генерируется автоматически каждый раз при изменении в файлах ресурсов  статический окончательный класс (final static)  содержит набор внутренних классов для обращения к ID ресурсов различных типов  drawable, layout, string, id и т.п. 18
  • 19.
    Файл R.java 19 public finalclass R { public static final class anim { public static final int abc_fade_in=0x7f040000; …. } public static final class drawable { public static final int abc_ab_bottom_solid_dark_holo=0x7f020000; …. } public static final class string { public static final int my_act_title = 0x7f0a0001; } public static final class layout { public static final int main= 0x7f030000; } … }
  • 20.
    Компоновки (разметки)  задаютрасположение графических компонентов на экране мобильного устройства  являются корневым элементом экранной формы  могут быть вложены в другие контейнеры (ViewGroup)  хранятся в виде XML-файла в папке /res/layout  позволяют отделить код от дизайна, как это принято во многих технологиях (HTML и CSS, Visual Studio и т.п.) 20
  • 21.
  • 22.
    Типы компоновок  FrameLayout LinearLayout – размещение элементов в одну линию вертикально или горизонтально  Vertical  Horizontal  TableLayout – размещение элементов в ячейках таблицы  GridLayout  RelativeLayout – свободное размещение элементов с возможностью привязки относительно границ экрана или других элементов 22
  • 23.
    LinearLayout 23 <?xml version="1.0" encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="16dp" android:paddingRight="16dp" android:orientation="vertical" > <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/to" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/subject" /> <EditText android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:gravity="top" android:hint="@string/message" /> <Button android:layout_width="100dp" android:layout_height="wrap_content" android:layout_gravity="right" android:text="@string/send" /> </LinearLayout>
  • 24.
    RelativeLayout 24 <?xml version="1.0" encoding="utf-8"?> <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="16dp" android:paddingRight="16dp" > <EditText android:id="@+id/name" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/reminder" /> <Spinner android:id="@+id/dates" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_below="@id/name" android:layout_alignParentLeft="true" android:layout_toLeftOf="@+id/times" /> <Spinner android:id="@id/times" android:layout_width="96dp" android:layout_height="wrap_content" android:layout_below="@id/name" android:layout_alignParentRight="true" /> <Button android:layout_width="96dp" android:layout_height="wrap_content" android:layout_below="@id/times" android:layout_alignParentRight="true" android:text="@string/done" /> </RelativeLayout>
  • 25.
  • 26.
    Текстовые поля (TextView) Предназначены для отображения статического текста  Внешний вид может быть изменён с помощью свойств и стилей (размер и цвет шрифта, фон и т.п.)  Могут содержать HTML-теги  Могут реагировать на нажатие (click)  Имя класса и XML-тега – TextView  метод-геттер для получения текста – textView1.getText()  метод-сеттер для установки значения – textView1.setText() 26
  • 27.
    Работа с TextView XML-разметка 27 <TextView android:id="@+id/text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:capitalize="characters" android:text="@string/hello_world" />  Код в классе экранной формы (activity) TextView txtView = (TextView) findViewById(R.id.text_id); final String Label = txtView.getText().toString();
  • 28.
    Оформление TextView  использованиеатрибутов: 28 <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="#00FF00" android:typeface="monospace" android:text="@string/hello" />
  • 29.
    Оформление TextView 29  использованиересурсов стилей:  создать файл в папке res/values/ <?xml version="1.0" encoding="utf-8"?> <resources> <style name="CodeFont" parent="@android:style/TextAppearance.Medium"> <item name="android:layout_width">fill_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:textColor">#00FF00</item> <item name="android:typeface">monospace</item> </style> </resources> <TextView style="@style/CodeFont" android:text="@string/hello" />  привязка стиля с помощью атрибута в разметке:
  • 30.
    Кнопки (Button)  Позволяютвыполнять действия при нажатии на них пользователем  Могут содержать текст и/или изображения  Внешний вид может быть изменён путём настройки свойств и стилей 30
  • 31.
    XML-разметка кнопок  стекстом 31 <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_text" ... /> <ImageButton android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/button_icon" ... /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_text" android:drawableLeft="@drawable/button_icon" ... />  с иконкой  с текстом и иконкой
  • 32.
    Методика работы с графическимикомпонентами  создать XML-разметку элемента в файле компоновки 32 <Button android:id="@+id/button1" android:text="@string/button_text"/> import android.widget.Button; …… Button btnStartPlay; btnStartPlay = (Button)findViewById(R.id.button1);  привязать компонент к переменной по идентификатору с помощью метода findViewById и класса ресурсов R.id  объявить переменную соответствующего типа в классе экранной формы (activity) (Требуется импорт класса компонента)
  • 33.
    Обработчики нажатия накнопку 1. Использование XML-атрибута onClick 2. Реализация интерфейса OnClickListener классом экранной формы (activity) 3. Установка обработчика методом setOnClickListener и создание анонимного класса 33
  • 34.
    Атрибут onClick  ВXML-разметке 34 <Button android:id="@+id/button_send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_send" android:onClick="sendMessage" /> /** Вызывается когда юзер нажимает на кнопку */ public void sendMessage(View view) { // выполнение действий }  В коде класса формы  Требования к методу:  общедоступный (public)  возвращает void  принимает один параметр типа View
  • 35.
    Открытие экранной формы (activity) Осуществляется с помощью системного сообщения о событии – Intent и метода startActivity 35 public void openNewActivity(View view) { Intent intent = new Intent(this, DisplayMessageActivity.class); startActivity(intent); }
  • 36.
    Отображение всплывающих сообщений 36 Context context =getApplicationContext(); CharSequence text = "Я всплыло!"; int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(context, text, duration); toast.show(); Toast.makeText(context, text, duration).show();
  • 37.
    Поля для ввода(EditText)  позволяют пользователю вводить информацию различного типа (имена, номера телефонов, адреса и т.п.)  поддерживают маскированный ввод для фильтрации вводимых символов  могут быть однострочными или многострочными  при нажатии на поле отображается экранная клавиатура 37