Главная » Разработка для Android » РАЗРАБОТКА ЭКРАНА С ИНСТРУКЦИЯМИ И ЭКРАНА С РЕЗУЛЬТАТАМИ

0

Вопросы, рассматриваемые в этом часе:

•            подготовка дизайна и разработка экрана с инструкциями;

•            работа с файлами;

•            подготовка дизайна и разработка экрана с результатами;

•            подготовка дизайна экранов с вкладками;

•            работа с XML-данными.

В этом часе вы разработаете еще два экрана приложения «Been There, Done That!»: экран с инструкциями и экран с результатами. Сначала вы займетесь разработкой экрана с инструкциями, взяв за основу элемент TextView и текст, загружаемый из текстового файла, что позволит вам познакомиться с некоторыми классами для работы с файлами, доступными в инструментарии Android SDK. После этого вы подготовите дизайн и реализуете экран с результатами. Поскольку к экрану с результатами предъявляются более сложные требования, он идеальный кандидат для использования элемента TabHost, предоставляющего набор вкладок. Наконец, вы протестируете экран, осуществив разбор тестовых XML-данных с результатами и отобразив соответствующую информацию на каждой вкладке.

ПОДГОТОВКА ДИЗАЙНА ЭКРАНА С ИНСТРУКЦИЯМИ

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

Вы хотите сделать так, чтобы экраны приложения обладали некоторым сходством. Таким образом, на экран с инструкциями можно добавить черты экрана меню навигации, например заголовок. Чтобы воплотить эскиз дизайна в соответствующем дизайн-макете, вам потребуется обновить файл макета /res/layout/help.xml и класс

QuizHelpActivity.

Рис. 9.1. Эскиз дизайна экрана с инструкциями

Рис 9.2. Дизайн-макет экрана с инструкциями приложения «Been There, Done That!»

Вы можете использовать такой же заголовок экрана, который применяется на экране с основным меню (реализованный при помощи элемента-контейнера RelativeLayout) и за которым будет следовать элемент TextView с возможностью прокрутки содержимого. На рис. 9.2 изображен дизайн макета экрана с инструкциями.

РЕАЛИЗАЦИЯ МАКЕТА ЭКРАНА С ИНСТРУКЦИЯМИ

Реализацию экрана с инструкциями вы начнете с добавлением новых ресурсов в проект. Затем вы обновите файл макета help.xml, чтобы отразить подготовленный дизайн-макет экрана с инструкциями.

Добавление новых ресурсов в проект

приложения «Been There, Done That!»

Помимо всех новых строковых ресурсов, ресурсов цветов и размеров, которые будут использованы в макете экрана с инструкциями, вам также потребуется добавить новый тип ресурса — ресурс файла с данными. В данном примере вы добавите текстовый файл /res/raw/quizhelp.txt, который содержит несколько абзацев текста с инструкциями для отображения в основном элементе TextView экрана с инструкциями.

ЗНАЕТЕ ЛИ ВЫ. ЧТО… __________________________________________________

Вы также может добавлять большие блоки текста в качестве строковых ресурсов. Такой подход может оказаться полезным при локализации приложе­ния. Использование строковых ресурсов также позволяет вам воспользоваться встроенной поддержкой тегов в стиле языка HTML. В данном примере мы оста­новили свой выбор на текстовом файле, чтобы продемонстрировать использо­вание ресурсов файлов с данными.

Обновление макета экрана с инструкциями

Файл макета help.xml определяет пользовательский интерфейс экрана с инструкциями. Откройте редактор ресурсов среды разработки Eclipse и удалите все существующие эле­менты пользовательского интерфейса из макета. Далее выполните следующие шаги, чтобы создать желаемый макет на основе ранее подготовленного дизайн-макета экрана.

Добавьте новый элемент-контейнер LinearLayout и присвойте его атрибуту background значение @drawable/bkgrnd. Все остальные элементы будут добавляться внутрь этого элемента-контейнера LinearLayout.

Добавьте тот же заголовок, который вы использовали в файле макета menu.xml. Он должен включать элемент-контейнер RelativeLayout, содержащий два элемента ImageView и один элемент TextView. Атрибуту text элемента TextView присвойте строковый ресурс с именем @string/help, чтобы отобразить соответствующий заголовок экрана.

Добавьте новый элемент TextView с именем TextView_HelpText внутрь элемента- контейнера LinearLayout, но за пределами элемента-контейнера RelativeLayout. Присвойте его атрибутам layout_width и layout_height значение fill_parent.

ЗНАЕТЕ ЛИ ВЫ, ЧТО… __________________________________________________

Вы можете автоматически связать номера телефона, веб-сайты, адреса электронной почты и почтовые адреса, отображаемые в элементе TextView, с приложениями Телефон, Браузер, Email и Карта операционной системы Android, присвоив атри­буту linksClickable элемента TextView значение true, а атрибуту autoLink – значение all.

Внеся необходимые изменения, сохраните файл макета help.xml.

ЗНАЕТЕ ЛИ ВЫ, ЧТО… __________________________________________________

Чтобы установить полужирное или курсивное начертание для текста, отражаемого в элементе TextView, используйте атрибут textStyle.

РАБОТА С ФАЙЛАМИ

Теперь, когда файл макета help.xml готов, вам нужно обновить класс QuizHelpActivity так, чтобы он считывал содержимое файла quizhelp.txt и сохранял полученный текст в элементе TextView с именем TextView_He lpText.

Добавление ресурсов файлов с данными

Ресурсы файлов с данными, как, например, текстовый файл quizhelp.txt. могут быть добавлены в проект путем помещения в каталог /raw. находящийся внутри каталога с ресурсами проекта. Вы можете либо создать новые файлы внутри этой папки, либо перетащить существующие файлы в файловом менеджере, либо использовать любой другой способ, который вы привыкли использовать для добавления файлов в проекты Android в среде разработки Eclipse.

ЗНАЕТЕ ЛИ ВЫ. ЧТО… __________________________________________________

Каждое Android-приложение имеет свой собственный закрытый каталог в файловой системе Android для хранения файлов приложения. Помимо широко известных классов File и Stream, вы можете обращаться к закрытым файлам и каталогам приложения при помощи следующих методов класса Context: getFilesDir(), getDir(), openFileInput() , openFileOutput() , deleteFile() и getFileStreamPath() .

Обращение к ресурсам файлов с данными

Платформа Android предоставляет множество классов, присущих языку Java, для выполнения операции ввода/вывода, включая классы для выполнения потоковых операций. Чтобы прочитать строковые данные из файла, используйте метод openRawResource(), как показано в следующем коде:

InputStream iFile = getResources().openRawResource(R.raw.quizhelp);

Обратите внимание, что, имея экземпляр класса InputStream, вы можете построчно или посимвольно прочесть данные из файла и получить результирующую строку. Сделать это можно несколькими способами. Создан соответствующую строку с текстом инструкций по игре, вы просто получаете ссылку на экземпляр элемента TextView, используя метод findViewById() , и присваиваете строку этому элементу, используя его метод setText(), как показано в следующем коде:

TextView helpText = (TextView) findViewById(R.id.TextView_HelpText); String strFile = inputStreamToString(iFile); helpText.setText(strFile);

КСТАТИ ___________________________________________________________

В предыдущем коде используется вызов вспомогательного метода inputStreamToString() , реализованного в классе QuizHelpActivity, который доступен на диске. прилагаемом к данной книге. Этот метод просто считывает данные из экземпляра класса InputStream и возвращает объект типа string, представляющий содержимое экземпляра класса InputStream.

Теперь сохраните файл QuizHelpActivity.java и запустите приложение «Been There, Done That!» на эмуляторе Android. Когда заставка приложения исчезнет с экрана, выберите в основном меню пункт, соответствующий экрану с инструкциями. Экран с инструкциями изображен на рис. 9.3.

ВЫПОЛНИТЕ САМОСТОЯТЕЛЬНО _______________________________

Теперь, когда на экране с инструкциями отображается нужная информация, вы мо­жете захотеть улучшить его внешний вид, чтобы сделать этот экран более похожим на экран, изображенный на рис. 9.3. Начните с изменения размера шрифта текста с инструкциями в элементе TextView. Затем попробуйте изменить другие атрибуты, например, отступы, гарнитуру, цвета текста и т.д. В качестве подсказки вы можете взглянуть на значения атрибутов, указанных для элемента TextView в реализации, доступной на диске, прилагаемом к данной книге.

Рис. 9.5. Дизайн-макет экрана с результатами приложения «Been There, Done That!»

РЕАЛИЗАЦИЯ МАКЕТА ЭКРАНА С РЕЗУЛЬТАТАМИ ИГРЫ

Реализацию экрана с результатами игры вы начнете с добавления новых ресурсов в проект. Затем вы обновите файл макета scores.xml, чтобы отразить ранее подготовленный дизайн-макет экрана с результатами.

Добавление новых ресурсов в проект

Помимо новых строковых ресурсов, ресурсов пистон м размеров, которые 6\д\т использо­ваны в макете экрана с результатами, вам также потребуется добавить новым тип ресурса — ресурс файла с XML.-данными. Со временем приложение «Been There, Done That!» начнет получать данные о результатах игры с удаленного сервера, однако пока вы можете разработать экран и использовать тестовые данные, представляющие результаты игры. Эти тестовые данные будут представлены в XML-формате, поэтому вы можете ис­пользовать структуру, которая в дальнейшем будет применяться для представления реальных результатов.

В этом примере вы добавите в каталог с ресурсами /res/xml два XML- файла — allscores.xml и friendscores.xml, которые представляют тестовые данные с результатами игры.

<?xml version="1.0" encoding="utf-8"?>

<!— Это фрагмент текстовых XML-данных с результатами игры —> <scores>

<score

username="LED" score="12345" rank= "1" /> <score

username="SAC" score="1234 4" rank= "2" /> <score

username="NAD" score="12339" rank="3" /> </scores>

Для представления результатов игры используется очень простая схема. Единственный элемент <scores> имеет несколько дочерних элементов <score>. Каждый элемент <score> имеет три атрибута: username, score и rank. В нашем случае вы можете предположить, что данные результатов будут заранее отсортированы и будут содержать максимум 20 (или любое другое число) записей.

Обновление макета экрана с результатами

Пользовательский интерфейс экрана с результатами определяется в файле макета scores.xml. Чтобы обновить этот макет в соответствии с разработанным дизайн-макетом, выполните следующие шаги.

ВНИМАНИЕ! ___________________________________________________________

В режиме дизайна редактор ресурсов среды разработки Eclipse неправильно отображает элементы TabHost. Для создания макетов, использующих данные элементы, вы должны переключиться в режим XML-разметки. Для просмотра вкладок нужно использовать эмулятор Android или реальное устройство, рабо­тающее над управлением операционной среды Android.

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

2.                                  Добавьте новый элемент-контейнер LinearLayout, присвоив его атри­буту android:background значение @drawable/bkgrnd. Все остальные элементы будут добавляться внутрь данного элемента-контейнера LinearLayout.

3.                                 Добавьте тот же заголовок, который вы использовали в других макетах. Он должен включать элемент-контейнер RelativeLayout с двумя элементами ImageView и одним элементом TextView. Атрибуту text элемента TextView присвойте строковый ресурс @string / scores, чтобы отобразить соответствующий заголовок экрана.

4.                                 Внутрь элемента-контейнера LinearLayout, но вне элемента-контей­нера RelativeLayout, добавьте элемент TabHost с именем TabHostl. Присвойте его атрибутам layout width и layout_height значение fill_parent.

5.                                 Внутрь элемента TabHost добавьте другой элемент-контейнер

LinearLayout, присвоив его атрибуту orientation значение vertical. Атрибутам layout_width и layout_height этого элемента-контейнера присвойте значение fill _p arent.

6.                                 Внутрь элемента-контейнера LinearLayout, добавленного на предыду­щем шаге, добавьте элемент TabWidget. Присвойте его атрибуту id значение

@android:id/tabs.

7.                                 Внутрь элемента-контейнера LinearLayout, добавленного на шаге 5, на том же уровне вложенности, на котором находится элемент TabWidget, добавьте элемент-контейнер FrameLayout. Присвойте атрибуту id этого элемента- контейнера FrameLayout значение @android:id/tabcontent, а атрибутам layout_width иlayout_height — значение fill_parent.

8.                                  Определите содержимое ваших вкладок. Внутрь элемента-контейнера FrameLayout добавьте два элемента-контейнера TableLayout — по одному для каждой вкладки. Вы будете использовать эти элементы-контейнеры TableLayout для отображения результатов игры. Назовите первый элемент-контейнер

TableLayout_FriendScores. Присвойте атрибутам layout_width и layout_height этих элементов-контейнеров значение fill_parent. Присвойте

атрибуту stretchColums значение *, чтобы размеры столбцов изменялось в зависимости от содержимого.

ВНИМАНИЕ! ___________________________________________________________

При создании подобного представления с вкладками вы должны использовать идентификатор, который был указан выше, — @android:id/tabcontent; в противном случае, в процессе выполнения приложения возникнут исключения. Это значение ссылается на специальный ресурс в пакете платформы Android. Это не то же самое, что значение @ + id/tabcontent. В последнем случае бу­дет создан новый идентификатор для объекта макета в пакете вашего приложе­ния.

Вы можете обеспечить прокрутку содержимого для многих элементов, поместив их внутрь элемента ScrollView. Например, чтобы обеспечить вертикальную прокрутку содержимого для элемента-контейнера TableLayout, добавьте этот элемент-контейнер внутрь элемента ScrollView и присвойте атрибуту scrollbars элемента ScrollView значение vertical. Также необходимо присвоить значения атрибутам layout_width и layout_height элемента ScrollView.

Часть файла макета экрана с результатами, относящаяся к элементу TabHost (с возможностью прокрутки содержимого вкладок, реализованных при помощи элементов-контейнеров TableLayout), должна выглядеть следующим образом:

<TabHost

android:id="@+id/TabHost1" android:layout width=fill parent" android:layout height="fill parent"> <LinearLayout

android:orientation="vertical" android:layout width="fill parent" android:layout height=fill parent"> <TabWidget

android:id="@android:id/tabs" android:layout width="fill parent" android:layout height="wrap content" /> <FrameLayout

android:id="@android:id/tabcontent" android:layout width=fill parent" android:layout height="fill parent"> <ScrollView

android:id="@+id/ScrollViewAllScores" android:layout width="fill parent" android:layout height=fill parent" android:scrollbars="vertical"> <TableLayout

android:id="@+id/TableLayout AllScores" android:layout width="fill parent" android:layout height=fill parent" android:stretchColumns="*"> </TableLayout> </ScrollView>

<ScrollView

android:id="@+id/ScrollViewFriendScores" android:layout width="fill parent" android:layout height="fill parent" android:scrollbars="vertical"> <TableLayout

android:id="@+id/TableLayout FriendScores" android:layout width="fill parent" android:layout height="fill parent" android:stretchColumns="[3]"></TableLayout> </ScrollView> </FrameLayout> </LinearLayout> </TabHost>

Сохраните файл макета scores.xml.

ВНИМАНИЕ! ___________________________________________________________

Если сейчас вы переключитесь в режим визуального представления макета, среда раз­работки Eclipse может сгенерировать ошибку «NullPointerException : null». Редактор ресурсов не поддерживает элементы TabHost платформы Android 2.1. При этом макет будет без проблем отображаться на эмуляторе и на реальных устройствах.

РАЗРАБОТКА ДИЗАЙНА ЭКРАНА С ВКЛАДКАМИ

Теперь вы должны полностью сосредоточится на файле QuizScoresActivity.java и добавить код для элементе, используемых элементом TabHost. Сначала вы должны проинициализировать элемент TabHost и затем добавить в него две вкладки, одна из которых — вкладка All Scores (Общие результаты) — будет использоваться в качестве вкладки по умолчанию. Наконец, вы воспользуетесь тестовыми данными с результатами игры для заполнения элемента-контеннера TableLayout в каждой вкладке.

Настройка элемента TabHost

Для правильного функционирования элемент TabHost сначала должен быть проинициализирован. Таким образом, вы должны получить доступ к экземпляру этого элемента, используя метод f indViewById () . Затем вы должны вызвать метод setup ( ) элемента TabHost, который выполняет инициализацию элемента TabHost и «склеивает» вместе элементы TabWidget и FrameLayout со специальными именами, чтобы образовать набор вкладок, как показано в следующем коде:

TabHost host = (TabHost) findViewById(R.id.TabHostl); host.setup();

Добавление вкладок в элемент TabHost

Теперь, когда вы получили доступ к вашему элементу TabHost и проини- циализировали его, вам нужно настроить каждую вкладку, используя метод addTab () . Этот метод принимает параметр типа TabSpec, который определяет содержимое вкладки. Например, следующий код создает вкладку All Scores (Общие результаты):

TabSpec allScoresTab = host.newTabSpec("allTab");

allScoresTab.setIndicator(getResources().getString(R.string.all scores ),

getResources().getDrawable(android.R.drawable.star on)); allScoresTab.setContent(R.id.ScrollViewAllScores); host.addTab(allScoresTab);

Объект типа TabSpec с именем allScoresTab имеет метку для ссылок allTab. На экране название вкладки представляется элементом TextView и значком (звездочкой). Наконец, содержимое вкладки определяется элементом с идентификатором ScrollViewAllScores, который содержит элемент-контейнер TableLayout с именем TableLayout_AllScores, как было указано в файле макета scores.xml. Затем вы добавляете вторую вкладку с меткой для ссылок friendTab в элемент TabHost. Вторая вкладка реализована почти так же, как и первая вкладка, за исключением содержимого (вместо лучших результатов игры на этой вкладке отображаются только результаты игры друзей пользователя).

Назначение вкладки, используемой по умолчанию

Теперь вы должны указать, какая вкладка будет отображаться по умолчанию. Для этого вам нужно вызвать метод setCurrentTabByld () и передать в этот метод метку соответствующей вкладки:

host.setCurrentTabByTag("allTab");

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

ВНИМАНИЕ! _________________________________________________________

Если на экране приложения должен отображаться только элемент TabHost, рассмотрите возможность использования класса TabActivity, который уп­рощает работу с элементом TabHost.

РАБОТА С XML-ДАННЫМИ

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

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

Получение XML-ресурсов

Сначала вы должны получить доступ к тестовым XML-данным, которые вы сохранили в ресурсах проекта. В частности, вам нужно разобрать файл /res/ xml/allscores.xml.

Вы можете проинициализировать экземпляр класса XmlResourceParser, используя метод getXML () , как показано в следующем коде:

XmlResourceParser mockAllScores = getResources().getXml(R.xml.allscores);

Разбор XML-файлов при помощи класса XmlResourceParser

Тестовые файлы с результатами игры используют очень простую схему, содержащую всего два тега:<scores> и <score >. Вам нужно найти все теги <score> и получить значения их атрибутов username, rank и score. Поскольку подразумевается, что вы будете работать с небольшим количеством данных, процедуру разбора ХМ L-данных можно реализовать при помощи простого цикла while(), используя для перехода между событиями метод next (), как показано в следующем коде:

int eventType = -1;

boolean bFoundScores = false;

// Find Score records from XML

while (eventType != XmlResourceParser.END_DOCUMENT) { if (eventType == XmlResourceParser.START_TAG) {

// Get the name of the tag (eg scores or score) String strName = scores.getName(); if (strName.equals("score")) { bFoundScores = true;

String scoreValue = scores.getAttributeValue(null, "score");

String scoreRank = scores.getAttributeValue(null, "rank"); String scoreUserName =

scores.getAttributeValue(null, "username"); insertScoreRow(scoreTable, scoreValue, scoreRank, scoreUserName);

}

}

eventType = scores.next();

}

В цикле вы ожидаете появления события START_TAG. Когда имя тега совпадет с именем тега <score>, вы будете знать, что обнаружена часть данных с результатами игры. После этого вы можете получить обнаруженные данные, используя метод get At tributeValue ( ) . Для каждого обнаруженного результата вы добавляете новый элемент TableRow в соответствующий элемент-контейнер TableLayout (на соответствующей вкладке).

Внесение завершающих штрихов иа экраи с результатами

Написав код для разбора двух тестовых ХМЬ-файлов и заполнения двух элементов- контейнеров TableLayout внутри элемента TabHost, внести несколько незначительных изменений в класс QuizScoresActivity. Вы должны добавить заголовок в виде элемента TableRow в каждый элемент-контейнер TableLayout, придать заголовкам столбцов привлекательный вид, а также обработать ситуацию, когда данные о результатах игры недоступны.

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

Рис. 9.6. Экран с результатами приложения «Been There, Done That!»

ИТОГИ

В этом часе вы добавили два новых экрана в опрос-викторину «Been There, Done That!». В процессе реализации экрана с инструкциями вы узнали, как можно отображать большие объемы данных при помощи элемента TextView с возможностью прокрутки содержимого. Вы также узнали, как обращаться к ресурсам файлов и изменять настройки макета программным путем. В процессе реализации экрана с результатами вы познакомились с элементом TabHost, а также узнали, как можно разобрать XML- данные для отображения тестовых результатов.

ВОПРОСЫ И ОТВЕТЫ

Вопрос: Почему некоторым элементам, находящимся внутри элемента TabHost, необходимо присваивать специальные значения атрибутов id, определенные в пакете платформы Android?

Ответ: Порой вы будете сталкиваться с ситуациями, когда элементу необходимо присвоить специальное имя для его правильного функционирования. Чем сложнее элемент, тем выше вероятность, что операционной системе Android потребуется немного «клея» (или «магии») для нагрузки правильных шаблонов и ресурсов, используемых для отображения элемента в привычном для нас виде. Обычно подобные требования к именованию описаны в документации инструментария Android SDK.

Вопрос: При загрузке экрана с результатами игры возникает небольшая задержка. Почему?

1.

Ответ: Существует ряд причин, по которым этот экран действует медленнее по сравнению с другими. Во-первых, вы осуществляете разбор XML-данных, что само по себе может являться трудоемкой операцией. Во-вторых, вы создаете большое число элементов-представлений view для отображения данных о результатах игры. Вы должны всегда заботиться о том, чтобы трудоемкие вычисления выносились за пределы потока, управляющего пользовательским интерфейсом, — в этом случае приложение будет быстрее реагировать на действия пользователя, и вы сможете избежать ситуаций, когда операционная система Android завершает работу приложения из-за того, что оно вовремя не отвечает на запросы системы. Вы могли бы легко добавить рабочий поток, который бы занимался обработкой ХМ L-данных, а также попробовать найти другие, более эффективные, элементы для отображения данных о результатах игры. Наконец, в среде разработки Eclipse при включенном отладчике производительность приложения резко снижается.

ПРАКТИКУМ Контрольные вопросы

Верно ли это? Элемент TextView способен отображать большой объем

текста.

2.                Какой класс может быть использован для упрощения создания экранов с

вкладками?

A.        

B.        

C.        

Tabify.

TabActivity.

TabController.

3.                                 Верно ли это? XML-файлы обрабатываются менеджером XML-peсурсов, поэтому в их дополнительной обработке нет никакой необходимости.

4.                                 Элемент какого типа может быть использован для добавления возможности прокрутки содержимого?

A.                                Scroll Layout.

B.                                Scroller.

C.                                ScrollView.

Ответы

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

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

Неверно. XML-файлы могут быть добавлены в качестве ресурсов проекта, однако без раз­бора ХМ L-данных все равно не обойтись. В вашем распоряжении есть три механизма разбора XML-данных, при этом для разбора XML-данных из ресурсов по умолчанию используется механизм XML Pull Parser.

В. Элемент ScrollView может быть использован для размещения дочерних элементов view внутри области с возможностью прокрутки содержимого.

Литература: Дэрси JI., Android за 24 часа. Программирование приложений под операционную систему Google/ ДэрсиЛ., КондерШ. — М.: Рид Групп, 2011. — 464 с. — (Профессиональные компьютерные книги). ISBN 978-5-4252-0318-2

По теме:

  • Комментарии