Взаимодействие мобильного телефона с DDMS



После подключения телефона и установки драйвера USB необходимо проверить взаимодействие мобильного устройства и инструментов для отладки Android-приложений. Для этого запустите инструмент Dalvik Debug Monitor Server из подкаталога tools/ в каталоге установки вашего Android SDK или напрямую из среды разработки Eclipse, выбрав представление Device.

Если все было правильно установлено и настроено, в окне Dalvik Debug Monitorна панели Nameбудет отображаться подключенное внешнее мобильное устройство,

Инструмент Dalvik Debug Monitor Serverработает с реальным мобильным устройством так же, как и с эмулятором Android. Вы можете получать информацию о запущенных процессах, системных событиях, иметь доступ к файловой системе и многим другим функциям, предоставляемым этим инструментом.

9. Типы компоновок.

Компоновка – это архитектура расположения элементов интерфейса пользователя для конкретного окна, представляющего Activity/Компоновка определяет структуру расположения элементов в окне и содержит все элементы, которые предоставляются пользователю программы.

Создание компоновки

Компоновку можно объявлять двумя способами:

объявить элементы пользовательского интерфейса в XML-файле. Android обеспечивает прямой XML-словарь, который соответствует классам View и ViewGroup;

создать компоновку для окна в коде программы во время выполнения — инициализировать объекты Layout и дочерние объекты View, ViewGroup и управлять

их свойствами программно.

Типы компоновок

Используя различные виды ViewGroup, можно структурировать дочерние объекты View и ViewGroup многими способами в зависимости от требований к графическому интерфейсу приложения.

Для создания окон существует несколько стандартных типов компоновок, которые можно использовать в создаваемых приложениях:

FrameLayout;

LinearLayout;

TableLayout;

RelativeLayout.

Каждый из этих типов компоновки предлагает уникальный набор параметров, которые используются, чтобы определить позиции дочерних элементов View и структуру компоновки на экране. В зависимости от требований, предъявляемых к пользовательскому интерфейсу, выбирается наиболее подходящий тип компоновки. Далее мы рассмотрим все варианты компоновок и их использование.

FrameLayout

FrameLayout является самым простым типом компоновки. Это в основном пустое пространство на экране, которое можно позже заполнить только единственным дочерним объектом View или ViewGroup. Все дочерние элементы FrameLayout прикрепляются к верхнему левому углу экрана.

Чтобы поработать с компоновкой "вживую", создайте в Eclipse новый проект и в диалоговом окне New Android Projectвведите следующие значения:

Project name— FrameLayoutApp;

Application name— FrameLayout Sample;

Package name— com.samples.framelayout;

Create Activity— FrameLayoutActivity.

В компоновке FrameLayout нельзя определить различное местоположение для дочернего объекта View. Последующие дочерние объекты View будут просто рисоваться поверх предыдущих, частично или полностью затеняя их, если находящийся сверху объект непрозрачен, поэтому единственный дочерний элемент для FrameLayout обычно растянут до размеров родительского контейнера и имеет атри-

буты layout_и layout_height="fill_parent".

Компоновка FrameLayout применяется довольно редко, т. к. не позволяет создавать сложные окна с множеством элементов. Эту компоновку обычно используют для создания оверлеев.

 

LinearLayout

Компоновка LinearLayout выравнивает все дочерние объекты View в одном направлении — вертикально или горизонтально, в зависимости от того, как определен атрибут ориентации android:orientation:

android:orientation="horizontal" или android:orientation="vertical"

Все дочерние элементы помещаются в стек один за другим, так что вертикальный список объектов View будет иметь только один дочерний элемент в строке независимо от того, насколько широким он является. Горизонтальное расположение списка будет размещать элементы в одну строку с высотой, равной высоте самого высокого дочернего элемента списка.

Компоновка LinearLayout также поддерживает атрибут android:layout_weight, который назначает индивидуальный вес для дочернего элемента. Этот атрибут определяет "важность" объекта View и позволяет этому элементу расширяться, чтобы заполнить любое оставшееся пространство в родительском объекте View. Заданный по умолчанию вес является нулевым.

Компоновки могут быть и вложенными. Применение вложенных компоновок позволяет строить гибкие и легко перенастраиваемые окна и является самым распространенным способом при создании пользовательского интерфейса для Android-приложений.

TableLayout

Компоновка TableLayout позиционирует свои дочерние элементы в строки и столбцы. TableLayout не отображает линии обрамления для их строк, столбцов или ячеек.

TableLayout может иметь строки с разным количеством ячеек. При формировании компоновки таблицы некоторые ячейки при необходимости можно оставлять пустыми.

При создании компоновки для строк используются объекты TableRow, которые являются дочерними классами TableLayout (каждый TableRow определяет единственную строку в таблице). Строка может не иметь ячеек или иметь одну и более ячеек, которые являются контейнерами для других объектов View или ViewGroup. Ячейка может также быть объектом ViewGroup (например, допускается вложить другой

TableLayout или LinearLayout как ячейку).

 

Компоновка TableLayout на практике применяется довольно редко, обычно вместо нее используют сочетание компоновок LinearLayout. TableLayout удобно использовать, если расположение элементов представлено в виде "таблицы", как в нашем примере на рис. 4.10.

 

RelativeLayout

RelativeLayout (относительная компоновка) позволяет дочерним объектам определять свою позицию относительно родительского объекта или относительно соседних дочерних элементов (по идентификатору элемента).

В RelativeLayout дочерние элементы расположены так, что если первый элемент расположен по центру экрана, другие элементы, выровненные относительно первого элемента, будут выровнены относительно центра экрана. При таком расположении, при объявлении компоновки в XML-файле, элемент, на который будут ссылаться для позиционирования другие объекты, должен быть объявлен раньше, чем другие элементы, которые обращаются к нему по его идентификатору.

Если в программном коде мы не работаем с некоторыми элементами пользовательского интерфейса, создавать идентификаторы для них необязательно, однако определение идентификаторов для объектов важно при создании RelativeLayout. В компоновке RelativeLayout расположение элемента может определяться относительно другого элемента, на который ссылаются через его уникальный идентификатор:

android:layout_toLeftOf="@id/TextView1"

Тип компоновки RelativeLayout применяется довольно редко. Тем более что такое задание расположения элементов зависит от разрешения и ориентации экрана мобильного устройства.

 

 

10. Базовые виджеты.

Виджет— это объект view, который служит интерфейсом для взаимодействия с пользователем. Говоря простым языком, виджеты — это элементы управления. Android обеспечивает набор готовых вкджетов, таких как кнопки, переключатели и текстовые поля, с помощью которых можно быстро сформировать пользовательский интерфейс приложения.

 

Текстовые поля

Текстовые поля в Android представлены двумя классами:

TextView;

EditText.

Виджет TextView предназначен для отображения текста без возможности редактирования его пользователем. Если необходимо редактирование текста, используется виджет EditText.

Классы TextView и EditText имеют множество атрибутов и методов, наследуемых от класса View, который был рассмотрен в предыдущей главе. Иерархия классов текстовых полей представлена на рис. 5.1.

 

 

 

TextView

Виджет TextView — самый простой и в то же время один из самых используемых в приложениях виджетов. TextView служит для представления пользователю описательного текста без возможности его редактирования.

Кроме того, элемент TextView используется как элемент для отображения текстовых данных в контейнерных виджетах для отображения списков. От класса TextView наследуется множество других виджетов: кнопки, флажки и переключатели — элементы управления, на которых может быть отображен текст. В примерах, приведенных далее в этой части, мы будем активно применять этот элемент для отобра-

жения состояния элементов при обработке событий.

Виджет TextView, так же как и объект View, от которого он наследуется, поддерживает собственное разнообразие XML-атрибутов. Некоторые атрибуты являются определенными только в объекте TextView, но эти атрибуты могут также наследоваться любыми объектами, которые расширяют этот класс.

Свойства для элемента TextView можно задавать как в файле компоновки, так и впрограммном коде. Например, для отображения текста в TextView в файле компоновки используется атрибут android:text, а в программном коде вызывается методsetText() этого класса.

В целом, XML-словарь элементов пользовательского интерфейса близок к структуре классов и методов этих элементов, где имя элемента соответствует имени класса,а атрибуты элемента — методам этого класса. Фактически, соответствие являетсячасто настолько точным, что легко предположить без обращения к документацииAndroid, какой XML-атрибут передает метод класса или, наоборот, какой методкласса соответствует конкретному XML-элементу.

 

Некоторые атрибуты виджета TextView являются общими по отношению ко всем объектам View, потому что они унаследованы от корневого класса View.

Если в программном коде мы работаем с данным элементом пользовательского интерфейса, в файле компоновки обязательно определяют идентификатор, например

android:id="@+id/text1",

где символ @ в начале строки указывает, что синтаксический анализатор XML должен проанализировать и развернуть остальную часть строки идентификатора и определить это выражение как ресурс идентификатора. Символ + означает, что это новое имя ресурса, которое должно быть создано и добавлено к нашим ресурсам в файл R.java, который среда Android автоматически генерирует для проекта, как было показано в главе 3 (листинг 3.3).

Требование к уникальности идентификаторов не распространяется на все дерево элементов, но они должны быть уникальны в пределах части дерева (которая часто может быть и полным деревом, так что лучше создавать полностью уникальные идентификаторы, если это возможно).

Если планируется создание приложения с многоязыковой поддержкой пользовательского интерфейса, вместо непосредственного задания текста в XML-компоновке или в коде программы необходимо создать ссылку на текстовый XML-ресурс:

android:text="@string/text_hello", где text_hello — имя ресурса.

Требование к уникальности идентификаторов не распространяется на все дерево элементов, но они должны быть уникальны в пределах части дерева (которая часто может быть и полным деревом, так что лучше создавать полностью уникальные идентификаторы, если это возможно).

Если планируется создание приложения с многоязыковой поддержкой пользовательского интерфейса, вместо непосредственного задания текста в XML-компоновке или в коде программы необходимо создать ссылку на текстовый XML-ресурс:

android:text="@string/text_hello",

где text_hello — имя ресурса.

В коде программы ссылка на XML-ресурс задается методом setText(), который принимает ссылку на идентификатор ресурса, определенного в файле R.java (автоматически сгенерированным средой разработки), например:

TextView text = (TextView)findViewById(R.id.text);

// Задаемтекстизресурсов

text.setText(R.string.text_hello);

У элемента TextView есть многочисленные методы и XML-атрибуты для работы с текстом. Например, основные XML-атрибуты, отображающие свойства элемента TextView:

android:textSize;

android:textStyle;

android:textColor.

Атрибут android:textSize задает размер текста. При установке размера текста используются несколько единиц измерения:

px (pixels) — пикселы;

dp (density-independent pixels) — независимые от плотности пикселы. Это абст-

рактная единица измерения, основанная на физической плотности экрана;

sp (scale-independent pixels) — независимые от масштабирования пикселы;

in (inches) — дюймы, базируются на физических размерах экрана;

pt (points) — 1/72 дюйма, базируются на физических размерах экрана;

mm (millimeters) — миллиметры, также базируются на физических размерах эк-

рана.

Обычно при установке размера текста используются единицы измерения sp, кото-

рые наиболее корректно отображают шрифты, например:

android:textSize="48sp";

Атрибут android:textStyle представляет стиль текста (нормальный, полужирный, наклонный). Для задания стиля текста используются только следующие константы:

normal;

bold;

italic.

Вот пример установки стиля через атрибуты в файле компоновки:

android:textStyle="bold";

Атрибут android:textColor задает цвет текста. Для задания цвета используются четыре формата в шестнадцатеричной кодировке:

#RGB;

#ARGB;

#RRGGBB;

#AARRGGBB,

 

где R, G, B — соответствующий цвет, А — альфа-канал (alpha-channel), который определяет прозрачность. Значение A, установленное в 0, означает прозрачность 100%. Значение по умолчанию без указания значения alpha равно 1, т. е. непрозрачно.

Для всех вышеперечисленных атрибутов в классе TextView есть соответствующие методы для чтения или задания соответствующих свойств.

 

EditText

Элемент EditText — это текстовое поле для пользовательского ввода. EditText представляет собой тонкую оболочку над классом TextView, которая сконфигурирована для редактирования вводимого текста.

Основной метод класса EditText — getText(), который возвращает текст, содержащийся в окне элемента EditText. Возвращаемое значение имеет тип Editable. Этот тип представляет собой интерфейс для текста, информационное наполнение которого может изменяться (в противоположность типу String, который является неизменяемым, при его изменении просто создается новый экземпляр String).

В классе EditText есть метод setHint() для отображения подсказки. С помощью этого метода можно задать текст подcказки, который увидит пользователь в этом элементе, например "Enter text...".

В классе также определены методы для выделения текста:

selectAll() — выделяет весь текст в окне;

setSelection(int start, int stop) — выделяет участок текста с позиции start до позиции stop;

setSelection(int index) — перемещает курсор на позицию index.

Большинство методов для работы с текстом и его форматированием унаследованы от базового класса TextView. Чащевсегоиспользуютсяметоды setTypeface(null, Typeface), setTextSize(int textSize), SetTextColor(int Color).

 

Полосы прокрутки

Класс TextView использует свою собственную прокрутку и в принципе не требует добавления отдельных полос прокрутки, но применение видимых полос прокрутки вместе с TextView (или любым другим элементом или контейнером, размеры которого больше размера экрана мобильного устройства) улучшает внешний вид и повышает удобство использования приложения.

Полосы прокрутки в Android представляют виджеты SсrollView и Horizontal- ScrollView, которые являются контейнерными элементами и наследуются от ViewGroup, как показано на рис. 5.5.

 

Элементы ScrollView и HorizontalScrollView — это контейнеры типа FrameLayout, что означает, что в них можно разместить только одно дочернее представление.

Этот дочерний элемент может, в свою очередь, быть контейнером со сложной иерархией объектов. В качестве дочернего элемента для полос прокрутки обычно используют LinearLayout с вертикальной или горизонтальной ориентацией элементов.

Виджет ScrollView, несмотря на свое название, поддерживает только вертикальную прокрутку, поэтому для создания вертикальной и горизонтальной прокрутки необходимо использовать ScrollView в сочетании с HorizontalScrollView. Обычно ScrollView используют в качестве корневого элемента, а HorizontalScrollView — дочернего.

 

Отображение графики

Для отображения графики предназначен виджет ImageView. Как и элемент TextView,который является базовым виджетом для текстового наполнения пользовательскогоинтерфейса, ImageView является базовым элементом для графического наполнения иможет использоваться в контейнерных виджетах для отображения графики.

Класс ImageView может загружать изображения из различных источников, таких какресурсы приложения или внешние файлы с изображениями. В этом классе существует несколько методов для загрузки изображений:

r setImageResource(int resId) — загружает изображение по его идентификаторуресурса;

r setImageURI(Uri uri) — загружает изображение поего URI;

r setImageBitmap(Bitmap bitmap)— загружает растровое изображение.

Для загрузки изображения в XML-файле компоновки используется атрибутandroid:src.

Кроме того, в классе ImageView определены методы для установки размеров изображения — setMaxHeight(), setMaxWidth(), getMinimumHeight(), getMinimumWidth(),а также его масштабирования — getScaleType(), setScaleType().

 

Виджеты для андроид на андроиде 5.1, в андроид 6.0, андроид 7.0 и более ранних версиях представляют собой приложения, которые работают на рабочем столе.

В отличие от ярлыков приложений, вы можете запустить их, не открывая новое окно или левую сторону экрана.

11. Командные элементы управления и обработки событий.

Обработка событий

Класс View содержит коллекцию вложенных интерфейсов, которые называютсяOn...Listener(), в каждом из которых объявлен единственный абстрактный метод.Этот метод необходимо переопределить в вашем классе. Его будет вызывать система Android, когда c экземпляром View, к которому был подсоединен слушательсобытия, будет взаимодействовать с пользователем.

Всего класс View содержит шесть вложенных интерфейсов:

OnClickListener;

OnLongClickListener;

OnFocusChangeListener;

OnKeyListener;

OnTouchListener;

OnCreateContextMenuListener.

Например, если требуется, чтобы кнопка получила уведомление о нажатии ее поль-

зователем, необходимо в классе окна реализовать интерфейс OnClickListener и оп-

ределить его метод обратного вызова onClick(), куда будет помещен код обработки

нажатия кнопки, и зарегистрировать слушатель события с помощью метода

setOnClickListener():

button1.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

mText.setText("Click on First Button");

}

});

Кнопки и флажки

Кнопки и флажки в Android представлены следующими классами:

Button;

CheckBox;

ToggleButton;

RadioButton;

ImageButton.

Почти у всех вышеперечисленных виджетов базовым классом является TextView, откоторого они наследуют многочисленные методы для отображения и форматирования текста. Исключение составляет виджет ImageButton, который является наследником класса ImageView и представляет собой кнопку с изображением без текста.

Класс Button представляет командную кнопку и наследуется от TextView.Он является базовым классом для класса CompoundButton. От класса CompoundButtonнаследуются остальные кнопки: CheckBox, ToggleButton и RadioButton. Иерархияклассов кнопок представлена на рис. 6.1.

Object

View

TextView

Button

CompoundButton

CheckBox

RadioButton

ToggleButton

ImageView

ImageButton

Рис. 6.1.Иерархияклассов Button, CheckBox, ToggleButton, RadioButton и ImageButton

Класс CompoundButton представляет базовую функциональность для кнопок с двумясостояниями — checked и unchecked. При нажатии состояние кнопки изменяетсяна противоположное. Класс CompoundButton содержит вложенный интерфейсOnCheckedChangeListenerc единственным методом onCheckedChanged().

Button

Класс Button (Кнопка) — самый простой из всех элементов управления и при этомсамый используемый. Чаще всего кнопка требует написания кода обработки события нажатия onClick.Следующий пример реализует обработчик события onClick(). Когда выполняетсящелчок на кнопке, появляется сообщение, отображающее имя кнопки.

 

RadioButton и RadioGroup

Виджеты RadioButton (Переключатели) обычно используются в составе группы —контейнера RadioGroup. Контейнер RadioGroup наследуется от ViewGroup и можетиспользоваться в качестве корневого элемента компоновки окна, если на экранебудет располагаться только группа переключателей, или в качестве вложенного вдругой контейнер, например LinearLayout.

Переключатели дают возможность пользователю выбирать одну из нескольких опций. Когда вы используете множество элементов управления RadioButton в одномконтейнере, выбранным может быть только один из них. Поэтому если у вас естьтри опции, например Red, Greenи Blue, и если выбрана опция Red, а пользовательщелкает на Blue, то опция Redавтоматически отключается. Основной метод дляизменения состояния — toggle(), который инвертирует состояние переключателя.

Кроме того, от базового класса наследуются и другие методы, напримерisChecked(), который возвращает состояние кнопки, и setChecked(), изменяющийсостояние кнопки в зависимости от параметра.

CheckBox

Элемент CheckBox (Флажок) — это переключатель с двумя состояниями. Для программного отслеживания изменения состояния элемента необходимо реализовать интерфейс CompoundButton.OnCheckedChangeListener.

ToggleButton

Виджет ToggleButton — это кнопка с двумя состояниями: "включено" и "выключено". По умолчанию на кнопке определены надписи ON/OFF и LED-индикатор, изменяющий цвет на зеленый при переключении в состояние ON.

Основные свойства ToggleButton — android:textOff и android:textOn, устанавливающие надписи на кнопке в разных состояниях. В программном коде им соответствуют методы setTextOff() и setTextOn().

Метод setChecked(boolean checked) позволяет программно менять состояние кнопки.

Основное событие ToggleButton — изменение состояния кнопки onCheckedChanged().

ImageButton

Виджет ImageButton представляет собой кнопку с изображением (вместо текста). По умолчанию ImageButton похож на обычный элемент Button, со стандартным фоном кнопки, который изменяет цвет во время других состояний кнопки.

Изображение на поверхности кнопки определяется атрибутом android:src в элементе <ImageButton> или в программном коде методом setImageResource(int).

Закладки

Закладки в Android являются контейнерными виджетами и представлены классами TabHost и TabWidget (рис. 6.8).

Виджет TabHost позволяет группировать связанные элементы управления в серии страниц-вкладок. Элемент TabHost является контейнером для коллекции элементов типа TabWidget. Когда пользователь выбирает закладку, этот объект посылает сообщение в родительский контейнер TabHost для переключения на выбранную закладку.

 

Контейнерный виджет TabHost используется в основном только для добавления закладок и обработки вызовов выбранных закладок. Основные методы для работы с TabHost:

setup() — инициализирует контейнер закладок. Необходимо вызывать перед добавлением закладок, если TabHost загружается методом findViewById();

addTab() — добавляет новую закладку;

setCurrentTab() — ставит заданную закладку на передний план.

Большинство методов для работы с закладками реализованы в классе TabWidget.

Чтобы работать с закладками в программном коде, для каждой закладки должны быть определены три свойства:

индикатор позиции табуляции — текст, отображаемый на закладке, например "Document 1";

информационное наполнение — элемент или контейнер, расположенный на данной закладке;

тег для идентификации в программном коде.

 

Их необходимо определить созданием экземпляра вложенного класса TabSpec для каждой закладки.

Командные элементы управления выполняют действия, причем делают это немедленно. Главным и по сути единственным командным элементом является кнопка, которая обладает множеством вариантов отображения. Элементы меню также являются командными идиомами.

Кнопки

Кнопки обычно легко опознаются благодаря их псевдотрехмерности (рис. 5.3). Действие выполняется сразу после нажатия на кнопку. Часто особым образом выделяется кнопка по умолчанию, соответствующая наиболее часто используемому действию.

Кнопка - удобный и привлекательный с визуальной точки зрения элемент управления. Весь ее облик подсказывает, что на нее можно нажать, и это характеризует ее ожидаемое назначение. Рекомендуется изменять внешний вид нажатой кнопки, так как это облегчает понимание работы программы пользователем.

Кнопки-значки

Кнопки, помещенные на панель инструментов, обычно становятся квадратными, теряют текстовую надпись и обзаводятся пиктограммой - пояснением в виде графического значка ( рис. 5.4).

Считается, что кнопки-значки очень удобны: они постоянно на виду и взаимодействовать с ними проще, чем с элементами раскрывающегося меню. Поскольку они постоянно видны, то легко запоминаются. У большинства пользователей не возникает вопросов относительно ожидаемого назначения кнопки. Проблема в том, что изображение на кнопке иногда бывает непонятным. Например, пиктограмма с изображением дискеты, традиционно обозначающая сохранение, часто непонятна молодым пользователям, которые никогда не работали с реальными дискетами.

Гиперссылки

Текстовые гиперссылки - распространенный способ навигации в сети и веб-приложениях, однако при программировании для мобильных устройств их следует избегать. Дело в том, что попасть по ссылке пальцем с первого раза часто затруднительно и пользователей раздражает необходимость повторения этих действий.

12. Диалоговые окна.

Диалог — обычно маленькое окно, которое появляется перед текущим Activity.

Основной Activity при этом теряет фокус, и диалог принимает все пользовательское взаимодействие. Диалоги обычно используются для уведомлений и коротких действий, которые непосредственно касаются приложения, а также для индикации прогресса выполнения длительных задач.

Типы диалогов

Система Android поддерживает следующие типы диалоговых окон:

AlertDialog — диалог c кнопками, списком, флажками или переключателями;

ProgressDialog — диалог с индикатором прогресса;

DatePickerDialog — диалог выбора даты;

TimePickerDialog — диалог выбора времени.

Иерархия классов диалоговых окон представлена на рис. 10.1.

Класс Dialog является базовым для всех классов диалоговых окон. Поскольку ProgressDialog, TimePickerDialog и DatePickerDialog — расширения класса AlertDialog, они также могут иметь командные кнопки для открытия и закрытия диалогового окна.

 

Создание диалоговых окон

Диалоговое окно всегда создается и отображается как часть находящегося в фокусе Activity. Диалоги обычно создают внутри метода обратного вызова onCreateDialog(), который необходимо реализовать в коде Activity. При этом система Android автоматически управляет состоянием диалога (или нескольких диалогов) и прикрепляет их к текущему Activity, фактически делая его владельцем каждого диалога.

Для отображения диалогового окна необходимо вызвать метод showDialog()

и передать ему в качестве параметра идентификатор диалога (константа, которую

надо объявить в коде программы), который вы хотите отобразить. Например:

private static final int IDD_EXIT = 0;

...

showDialog(IDD_EXIT);

Когдадиалогвызываетсявпервые, система Android вызывает onCreateDialog() изоткрытого Activity. В onCreateDialog() передается тот же самый идентификатор, который передавался в showDialog(). После того как вы создали диалог, вы возвращаете объект Dialog в конце метода.

Если в Activity должны вызываться несколько различных диалоговых окон, сначала необходимо определить целочисленный идентификатор для каждого диалога, например:

private static final int IDD_ALERT = 0;

private static final int IDD_EXIT = 1;

Эти идентификаторы потом можно использовать в вызове метода showDialog() и в обработчике события onCreateDialog() в операторе switch:

protected Dialog onCreateDialog(int id) {

Dialog dialog;

switch(id) {

case IDD_ALERT:

...

break;

case IDD_EXIT:

...

break;

default:

dialog = null;

}

returndialog;

}

Внутри оператора switch описывается сама процедура создания диалоговых окон, которая различна для каждого типа диалоговых окон и будет описана в следующих разделах этой главы.

Перед отображением диалогового окна Android вызывает дополнительный метод обратного вызова onPrepareDialog(int, Dialog). Если требуется перед каждым вызовом диалогового окна изменять его свойства (например, текстовое сообщение или количество кнопок), это можно реализовать внутри этого метода. В этот метод передают идентификатор диалога и сам объект Dialog, который был создан в мето-

де обратного вызова onCreateDialog().

AlertDialog

Диалог AlertDialog — расширение класса Dialog. Он используется при построении большинства диалоговых окон. В этих диалогах доступна для использования любая функциональность из нижеперечисленных:

заголовок;

текстовое сообщение;

одна, две или три кнопки;

список;

флажки;

переключатели

AlertDialog c кнопками

Для создания AlertDialog с кнопками используется группа методов set...Button() класса AlertDialog.Builder:

setPositiveButton();

setNegativeButton();

setNeutralButton().

Для создания диалогового окна сначала надо создать объект класса Builder, передав в качестве параметра контекст приложения:

AlertDialog.Builder builder =new AlertDialog.Builder(getApplicationContext());

Затем, используяметодыкласса Builder, задатьдлясоздаваемогодиалоганеобходимыесвойства, напримертекстовоесообщениевокнеметодом setMessage():builder.setMessage("Are you sure you want to exit?");

После задания свойств диалога определяют командные кнопки диалога и обработку событий на них. В AlertDialog можно добавить только по одной кнопке каждого типа: Positive, Negative и Neutral, т. е. максимально возможное количество кнопок в диалоге — три.

Для каждой кнопки используется один из методов set...Button(), которые принимают в качестве параметров надпись для кнопки, и интерфейс DialogInterface.OnClickListener, который определяет действие, когда пользователь нажимает кнопку.

AlertDialog cо списком

Чтобы создавать AlertDialog со списком выбираемых пунктов, необходимо использовать метод setItems(), параметрами которого является массив данных для отображения в списке диалога и интерфейс DialogInterface.OnClickListener, который определяет действие, когда пользователь выбирает элемент списка, например:

CharSequence[] colors = {"Red", "Green", "Blue"};

...

builder.setItems(colors, new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int item) {

// Обрабатываем событие выбора элемента списка

Toast.makeText(getApplicationContext(),

"Color: " + mColors[item], Toast.LENGTH_SHORT).show();

}

});

AlertDialog c переключателями

Для создания диалогового окна с переключателями применяется метод setSingleChoiceItems(). Если диалоговое окно создается внутри onCreateDialog(), система Android управляет состоянием списка с переключателями. Пока главный Activity, из которого был вызван диалог, остается незакрытым, диалоговое окно при последующих вызовах запоминает ранее выбранные пункты.

Создание AlertDialog с переключателями похоже на создание диалога со списком, только вместо метода setItems() вызывается метод setSingleChoiceItems():

Первый параметр в методе setSingleChoiceItems() — массив значений для радиокнопок, второй параметр — целочисленное значение индекса переключателя, который будет включен по умолчанию при вызове диалога. Если требуется по умолчанию установить все переключатели в выключенное состояние, необходимо установить значение второго параметра в –1.

AlertDialog c флажками

При создании диалогового окна с переключателями применяется метод setSingleChoiceItems(). Если диалоговое окно создается внутри onCreateDialog(), система Android управляет состоянием списка. Пока текущий Activity активен, диалоговое окно при последующих вызовах запоминает ранее выбранные пункты.

Создание диалогового окна с флажками очень похоже на создание диалога с переключателями, только вместо метода setSingleChoiceItems() вызывается метод

setMultiChoiceItems():

Первый параметр в методе setMultiChoiceItems() — массив значений для списка с флажками, второй параметр — булевый массив состояний флажков списка по умолчанию при вызове диалога. Так же, как и для диалога с переключателями, для диалога с флажками добавляют командные кнопки для его закрытия.

ProgressDialog

ProgressDialog — подкласс AlertDialog, который представляет собой диалоговое окно с индикатором прогресса. В диалог также можно добавить управляющие кнопки, например для отмены выполняемой задачи.

Для создания диалога с индикатором прогресса необходимо инициализировать объект ProgressDialog вызовом конструктора класса ProgressDialog(Context), передав в качестве параметра контекст текущего Activity:

Обычно выполнение длительных задач происходит в другом потоке, т. е. в нашем приложении необходимо создать второй поток и сообщать о прогрессе его выполнения назад, в основной поток Activity через объект Handler

DatePickerDialog

DatePickerDialog предназначен для выбора даты пользователем. Обычно перед созданием диалога выбора даты надо получить текущий год, месяц и день из системы.

Это можно сделать, создав экземпляр класса Calendar и записав дату через метод get() класса Calendar в переменные, созданные в нашем классе:

Calendar c = Calendar.getInstance();

mYear = c.get(Calendar.YEAR);

mMonth = c.get(Calendar.MONTH);

mDay = c.get(Calendar.DAY_OF_MONTH);

Затем в onCreateDialog() надо создать объект DatePickerDialog вызовом конструктора класса:

DatePickerDialog dialog = new DatePickerDialog(

this, mDateSetListener, mYear, mMonth, mDay);

Первый параметр, передаваемый вконструктор, — это контекст текущего Activity, второй — имя метода обратного вызова для обработки события установки даты, остальные параметры содержат дату, которую отобразит запускаемый диалог.:

Имя метода обратного вызова для обработки события установки даты — это реализация вложенного интерфейса DatePickerDialog.OnDateSetListener, которая, например, может модифицировать передаваемые переменные, хранящие дату:

Вызовдиалогапроизводитсяобычнымспособом — черезметодshowDialog(intdialogId).

 

TimePickerDialog

TimePickerDialog предназначен для выбора даты пользователем. В целом процедура создания диалога выбора времени аналогична созданию DatePickerDialog с небольшими отличиями в деталях.

 


Дата добавления: 2018-06-27; просмотров: 362; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!