Текст книги "Разработка Android-приложений в деталях"
Автор книги: Тимур Машнин
Жанр: Компьютеры: прочее, Компьютеры
Возрастные ограничения: +12
сообщить о неприемлемом содержимом
Текущая страница: 7 (всего у книги 20 страниц)
Мастер Android Icon Set
Мастер Android Icon Set ADT-плагина помогает создать значок Launcher Icons, представляющий приложение, значки Menu Icons опций меню, значки Action Bar Icons элементов панели действий, значки Tab Icons вкладок и значки Notification Icons уведомлений панели состояния.
Для создания значков приложения в окне Project Explorer нажмем правой кнопкой мышки на узле проекта и в контекстном меню выберем команду New | Other | Android | Android Icon Set, нажмем кнопку Next – в результате откроется окно мастера.
Окно мастера Android Icon Set позволяет выбрать с помощью переключателя тип значка и ввести имя его файла, после чего нажатием кнопки Next перейти к созданию значка.
Кнопка Text мастера позволяет создать значок в виде текста на цветном фоне. При этом поле Text: определяет текст значка, а кнопка Font: дает возможность выбрать шрифт текста.
Кнопка Image мастера с помощью кнопки Browse поля Image File: позволяет выбрать в качестве значка изображение.
Кнопка Clipart мастера с помощью кнопки Choose позволяет выбрать из предоставляемой коллекции изображение.
Ползунок Additional Padding мастера устанавливает отступ текста от краев значка путем масштабирования текста.
Для Launcher-значков опция Foreground Scaling: с помощью кнопок Crop и Center определяет способ масштабирования текста, опция Shape с помощью кнопок Square и Circle позволяет установить форму значка, а опции Background Color: и Foreground Color: обеспечивают выбор цвета фона и текста значка.
Для значков Action Bar Icons кнопки Holo Light и Holo Dark опции Theme определяют стиль отображения текста.
Окно Preview мастера показывает конечный вид значка для экранов устройства с различной плотностью.
После нажатия кнопки Finish мастера будет создан набор файлов значка в каталогах res/drawable– [ldpi, mdpi, hdpi, xhdpi] со спецификаторами, обеспечивающими поддержку экранов Android-устройства с различной плотностью, в соответствии с которой папка drawable с нужным спецификатором будет выбрана Android-системой для загрузки при выполнении кода приложения.
Мастер Android Test Project
Мастер Android Test Project помогает создать для выбранного Android-проекта набор тестов на базе Android-расширения платформы тестирования JUnit.
Android-расширение платформы тестирования JUnit представлено библиотекой android. test платформы Android.
ADT-плагин обеспечивает сборку проекта Android-тестов в пакет и его загрузку вместе с пакетом тестируемого Android-приложения в Android-устройство, в котором инструмент android.test.InstrumentationTestRunner запускает созданный набор тестов. При тестировании Android-приложения в Android-устройстве ни Android-система, ни инструмент InstrumentationTestRunner сами по себе не запускают Android-приложение, это делают Android-тесты путем вызова соответствующих методов.
Проект Android-тестов имеет ту же структуру, что и проект Android-приложения. Для предотвращения конфликтов в Android-системе имя пакета Android-тестов состоит из имени пакета тестируемого Android-приложения плюс расширение. test. Кроме того, файл манифеста AndroidManifest. xml проекта Android-тестов содержит тэг <instrumentation>, устанавливающий в качестве инструмента запуска тестов инструмент InstrumentationTestRunner, а также определяющий имя пакета тестируемого Android-приложения. Так как код инструмента InstrumentationTestRunner содержится в отдельной библиотеке android.test.runner, тэг <application> файла манифеста AndroidManifest. xml проекта Android-тестов содержит тэг <uses-library>, указывающий необходимость загрузки библиотеки android.test.runner.
Для тестирования компонентов Android-приложения в каталоге src проекта Android-тестов в пакете Android-тестов требуется создание классов, расширяющих классы тестов программного интерфейса Android Testing API:
android.test.ActivityInstrumentationTestCase2 <T extends android.app.Activity> – обеспечивает тестирование отдельного Activity-компонента, с его запуском в экземпляре Android-приложения, использующим обычную инфраструктуру Android-системы.
android.test.ActivityUnitTestCase <T extends android.app.Activity> – обеспечивает тестирование отдельного Activity-компонента, изолированного от Android-системы.
android.test.SingleLaunchActivityTestCase <T extends android.app.Activity> – обеспечивает тестирование отдельного Activity-компонента с его загрузкой только один раз для тестирования режима загрузки, отличного от standard (атрибут android: launchMode тэга <activity>).
android.test.ProviderTestCase2 <T extends android.content.ContentProvider> – обеспечивает тестирование отдельного ContentProvider-компонента в изолированном окружении.
android.test.ServiceTestCase <T extends android.app.Service> – обеспечивает тестирование отдельного изолированного Service-компонента.
android. test. ApplicationTestCase <T extends android. app. Application> – обеспечивает тестирование Application-класса.
Для создания проекта Android-тестов в меню File среды Eclipse выберем команду New | Other | Android | Android Test Project и нажмем кнопку Next, введем имя проекта и нажмем кнопку Next, выберем Android-проект для тестирования и нажмем кнопку Next, выберем версию Android-платформы и нажмем кнопку Finish. В результате ADT-плагином будет сгенерирована основа проекта Android-тестов для выбранного Android-приложения.
Для создания класса тестов в окне Project Explorer среды Eclipse нажмем правой кнопкой мышки на узле пакета проекта Android-тестов и в контекстном меню выберем команду New | Other | Java | Class, нажмем кнопку Next и в окне мастера создания Java-класса в поле Name: введем имя класса тестов, а в поле Superclass: введем имя расширяемого класса библиотеки android. test платформы Android, например android.test.ActivityInstrumentationTestCase2 <NameActivity>, где NameActivity – имя класса Activity-компонента тестируемого Android-приложения. После нажатия кнопки Finish будет сгенерирована и открыта в Eclipse-редакторе основа класса тестов.
После заполнения необходимым кодом класса тестов, для запуска Android-тестов запустим Android-эмулятор, используя приложение AVD Manager, после этого в окне Project Explorer среды Eclipse нажмем правой кнопкой мышки на узле проекта Android-тестов и в контекстном меню выберем команду Run As | Android JUnit Test. В результате ADT-плагин загрузит пакет Android-тестов вместе с пакетом тестируемого Android-приложения в Android-устройство, в котором будут запущены созданные тесты. При этом результаты тестирования будут возвращены в среду Eclipse для отображения в автоматически открывающемся представлении JUnit.
Среда разработки Android Studio
Начало работы
К сожалению или к счастью, в настоящее время официальной средой разработки Android-приложений является среда Android Studio, основанная на интегрированной среде IntelliJ IDEA.
После загрузки Android Studio встречает приглашением создать новый проект.
Нужно отметить, что проект среды Android Studio является аналогом Workspace в Eclipse, а модуль Android Studio это аналог Eclipse-проекта.
Кроме того, Android Studio поставляется с системой сборки проектов Gradle, интегрированной в Android Studio с помощью плагина Android Gradle. Система сборки проектов Gradle позволяет для одного и того же проекта и модулей генерировать различные APK-файлы приложения, имеющие различные свойства, например, платные или бесплатные, предназначенные для работы на различных уствойствах, например, для работы на смартфонах или планшетах.
Также Android Studio поставляется с инструментом lint, автоматически анализирующим код при компиляции на наличие потенциальных багов и возможностей оптимизации кода.
Сжатие, оптимизация и обсфукация кода APK-файла приложения в Android Studio производится с помощью инструмента ProGuard.
И lint и ProGuard запускаются в Android Studio системой сборки проектов Gradle.
Для облачных вычислений Android Studio позволяет создать и развернуть модуль App Engine.
После выбора Start a new Android Studio project откроется диалоговое окно, в котором нужно определить имя папки проекта, имя пакета и расположение проекта.
Далее оставим рекомендованный минимальный уровень Android API.
И выберем создание модуля с пустой активностью.
Нажмем Finish.
В результате будет сгенерирована основа модуля Android-приложения, Android-структура которого отобразится в View-представлении Project среды разработки.
Чтобы изменить Java SDK или Android SDK для проекта, в меню File выберем Project Structure и в SDK Location изменим каталог SDK.
Тут же выбрав модуль, можно изменить для него уровень Android API.
Изменить кодировку проекта на UTF-8 можно, в меню File выбрав Settings и далее File Encodings.
Android-структура приложения отличается от его файловой структуры.
Чтобы посмотреть файловую структуру приложения, нажмем на Android и выберем Project.
В отличие от Eclipse, здесь каталог src содержит пакет класса, расширяющего класс android.app.Activity, пакет тестов, папку ресурсов приложения и файл манифеста приложения.
Для добавления библиотек v4 support и v7 appcompat в модуль, в меню File выберем Project Structure и во вкладке Dependencies нажмем кнопку Add, выберем Library dependency и соответствующую библиотеку.
Для создания таких ресурсов, как animator (XML-файлы для создания объектов анимации), color (XML-файлы, определяющие цветовую гамму View-объектов), drawable (PNG, JPEG, GIF, 9-PNG и XML-файлы, формирующие графику), layout (XML-файлы для формирования структуры GUI-интерфейса Activity-объектов), menu (XML-файлы, описывающие меню приложения), raw (каталог предназначен для хранения таких данных приложения как файлов в формате MP3 или Ogg), values (XML-файлы для хранения строк, стилей, чисел, размеров и другое, используемых приложением, в виде пар имя-значение), xml (различные конфигурационные и ресурсные XML-файлы), нажмем правой кнопкой мышки на узле res модуля и выберем New | Android resource directory. Для создания ресурсного файла выберем New | Android resource file.
Дополнительно здесь предусмотрено создание папки anim для Tween-анимации, папки interpolator, папки mipmap для значков приложения, папки transition для Transition-анимации.
Значки приложения можно создать, нажав правой кнопкой мышки на узле res модуля и выбрав New | Image Asset.
Для создания каталога аssets, предназначенного для хранения данных приложения, доступ к которым осуществляется с помощью класса android.content.res.AssetManager, в контекстном меню выберем New | Folder | Assert Folder.
R-класс и класс BuildConfig находятся в каталоге build/generated модуля.
Кнопка AVD Manager панели Android Studio или меню Tools | Android | AVD Manager позволяют запустить приложение AVD Manager для создания и запуска эмулятора Android-устройства.
Кнопка Run «app’ панели Android Studio или меню Run | Run «app’ позволяют запустить модуль в Android-устройстве.
Меню Run | Edit Configurations позволяет изменить настройки запуска модуля.
В результате запуска Android-приложения каталог build модуля пополнится компилированными и конвертированными в DEX-формат виртуальной машины Dalvik файлами модуля, а также APK-файлом Android-приложения.
Папка build/outputs/apk будет содержать два APK-файла app-debug-unaligned. apk и app-debug. apk. Сначала генерируется файл app-debug-unaligned. apk, а затем на его основе генерируется оптимизированный app-debug. apk файл, который и загружается для отладки.
Отдельно для сборки модуля щелкнем правой кнопкой мышки на модуле и выберем Make Module «app’.
Для подготовки к публикации Android-приложения и создания подписанного APK-файла приложения в меню Build выберем Generate Signed APK. Далее для создания хранилища закрытого ключа, которым будут подписываться Android-приложения, нажмем кнопку Create new, определим путь и имя файла хранилища, введем пароль и имя хранилища, параметры сертификата и нажмем кнопку OK. Нажмем кнопку Next, введем пароль и нажмем кнопку OK и далее кнопку Finish.
В результате в корневом каталоге модуля будет создан подписанный и готовый к публикации APK-файл приложения.
Для отладки Android-приложения в меню Run выберем Debug «app’. В результате откроется диалоговое окно выбора устройства, на котором будет запущено приложение, и после выбора, например, эмулятора и запуска приложения, в меню View | Tool Windows можно воспользоваться элементом Debug, открывающим или закрывающим окно отладчика.
В меню Run с помощью выбора Attach debugger to Android proccess можно присоединить отладчик к конкретному процессу.
В меню View | Tool Windows, выбрав Android, можно открыть окно инструмента DDMS.
Окно Structure среды Android Studio показывает структуру кода исходного файла, открытого в редакторе.
Окно Captures среды Android Studio показывает информацию, сохраненную с помощью инструмента DDMS.
В меню Tools | Android с помощью выбора Android Device Monitor можно запустить ADM-приложение.
В меню Tools | Android с помощью выбора Navigation Editor можно открыть окно структуры и компоновки Android-приложения.
Удалить модуль из проекта можно, выбрав меню File | Project Structure, затем модуль и нажав кнопку минус.
Создание различных версий Android-приложения с помощью Gradle
Система сборки Gradle обеспечивает в рамках одного модуля создание нескольких Android-приложений с разным контентом или создание одного Android-приложения для работы на разных устройствах пользователя или комбинацию этих двух случаев.
В первом случае в Google Play каждое Android-приложение публикуется отдельно, во втором случае разные версии публикуются в рамках одного Android-приложения.
Для создания нескольких Android-приложений в одном модуле в Android Studio откроем окно Project и выберем вариант Project.
В каталоге src скопируем и вставим папку main под именами free и paid.
Чтобы не было ошибки сборки, в папке main удалим файл MainActivity. java.
Откроем в редакторе файл сборки build.gradle и добавим код:
productFlavors {
paid {
applicationId «com. application. full»
}
free {
applicationId "com.application.demo»
}
}
Нажмем кнопку Sync Project with Gradle Files.
Теперь можно вести отдельно разработку для папки free и для папки paid.
Для запуска конкретного Android-приложения в эмуляторе, откроем окно Build Variants и выберем вариант приложения, который хотим запустить.
Нажмем кнопку Run «app’.
Для создания одного Android-приложения для работы на разных устройствах пользователя, все версии этого приложения должны иметь один и тот же пакет и быть подписаны одним ключом. Разные версии должны иметь разное значение android: versionCode.
При этом, при публикации, для этого набора APK-файлов создается одно описание, один набор значков, скриншотов, назначается одна цена. Для публикации используется режим Advanced mode Google Play.
Если разные версии Android-приложения создаются для разных уровней API, версия с более высоким значением android: minSdkVersion должна иметь более высокое значение android: versionCode. То же самое относится и к увеличению размера экрана для разных версий приложения. При этом значение android: versionName будет одинаковым для всех версий.
Для создания разных версий приложения для разных уровней API, откроем файл сборки модуля build.gradle в редакторе кода и добавим код:
productFlavors {
flavor1 {
versionCode 1
minSdkVersion 8
}
flavor2 {
versionCode 2
minSdkVersion 15
}
}
Для создания разных версий приложения для устройств с разными экранами, откроем файл сборки модуля build.gradle в редакторе кода и добавим код:
productFlavors {
phone {
versionCode 1
}
tablet {
versionCode 2
}
}
В каталоге src модуля создадим две папки phone и tablet с файлами AndroidManifest. xml:
<?xml version=«1.0» encoding=«utf-8»? >
<manifest xmlns: android="http://schemas.android.com/apk/res/android"
package=«com. application»>
<supports-screens
android: smallScreens=«true»
android: normalScreens=«true»
android: largeScreens=«false»
android: xlargeScreens=«false»/>
</manifest>
И
<?xml version=«1.0» encoding=«utf-8»? >
<manifest xmlns: android="http://schemas.android.com/apk/res/android"
package=«com. application»>
<supports-screens
android: smallScreens=«false»
android: normalScreens=«false»
android: largeScreens=«true»
android: xlargeScreens=«true»/>
</manifest>
В папках phone и tablet также можно вести разработку приложения для разных устройств.
При сборке APK-файлов, в главный файл AndroidManifest. xml будут добавляться разные элементы <supports-screens>.
Отображение контента Android приложением
Галерея изображений
Самую простую галерею изображений в Android-приложении можно реализовать с помощью компонента android.widget.ImageView и слушателя setOnTouchListener () контейнера ImageView-компонента.
Галерею с более сложной анимацией можно реализовать с помощью компонента android.widget.ViewFlipper.
При реализации с ImageView-компонентом смена изображений осуществляется методом setImageDrawable () и в памяти хранится только одно изображение. В реализации с ViewFlipper-компонентом определяется набор дочерних View-компонентов, переключение между которыми обеспечивается ViewFlipper-компонентом. При этом при большом количестве дочерних View-компонентов может возникнуть ошибка переполнения памяти. Поэтому при использовании ViewFlipper-компонента при переключении необходимо динамически очищать и добавлять дочерние компоненты для ViewFlipper-компонента.
Другой способ реализации галереи изображений – это применение компонента android.support.v4.view.ViewPager и фрагментов android.support.v4.app.Fragment. Однако при этом требуется минимальная версия 11 для Android API и использование дополнительной библиотеки Android Support Library.
ViewPager-компонент обеспечивает переключение между экранами, динамически создаваемыми с помощью адаптера android.support.v4.app.FragmentStatePagerAdapter, который определяет контент, создавая объекты android.support.v4.app.Fragment.
ImageView
Для создания галереи изображений в главном Activity-компоненте приложения определим показ начальной заставки и панели с кнопками переключения между разделами контента:
import java.io.IOException;
import java.io.InputStream;
import android.app.Activity;
import android.content.Intent;
import android.graphics. drawable. Drawable;
import android. os. Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View. OnClickListener;
import android.view.View. OnTouchListener;
import android. widget. Button;
import android.widget.ImageView;
import android.widget.ViewFlipper;
public class MainActivity extends Activity {
private float fromPosition;
@Override
protected void onCreate (Bundle savedInstanceState) {
super. onCreate (savedInstanceState);
setContentView(R.layout.activity_main);
ImageView image;
image = (ImageView)findViewById(R.id.imageViewLaunch);
try
{
InputStream ims = getAssets().open("_FRONT.jpg»);
Drawable d = Drawable.createFromStream (ims, null);
image.setImageDrawable (d);
}
catch (IOException ex)
{
return;
}
final ViewFlipper viewFlipper = (ViewFlipper)findViewById(R.id.viewFlipperContents);
viewFlipper.setOnTouchListener (new OnTouchListener () {
public boolean onTouch (View v, MotionEvent event) {
switch (event.getAction ())
{
case MotionEvent.ACTION_DOWN:
fromPosition = event.getX ();
break;
case MotionEvent.ACTION_UP:
float toPosition = event.getX ();
if (fromPosition> toPosition)
viewFlipper.setDisplayedChild (1);
default:
break;
}
return true;
}
});
final Intent intent = new Intent (this, ContentActivity.class);
final Button btn1= (Button)findViewById(R.id.button1);
btn1.setOnClickListener (new OnClickListener () {
public void onClick (View v) {
String name=«title»;
String value=btn1.getText().toString ();
intent. putExtra (name, value);
startActivity (intent);
}
});
final Button btnn= (Button)findViewById(R.id.buttonn);
btnn.setOnClickListener (new OnClickListener () {
public void onClick (View v) {
String name=«title»;
String value=btnn.getText().toString ();
intent. putExtra (name, value);
startActivity (intent);
}
});
}
@Override
public boolean onCreateOptionsMenu (Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected (MenuItem item) {
switch (item.getItemId ()) {
case R.id.action_settings:
final Intent intent = new Intent (this, MainActivity.class);
startActivity (intent);
return true;
default:
return super. onOptionsItemSelected (item);
}}}
В классе MainActivity в методе onCreate () создается экран, содержимое которого определяется компоновкой activity_main. xml:
<ViewFlipper xmlns: android="http://schemas.android.com/apk/res/android"
android: id="@+id/viewFlipperContents»
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=".MainActivity»>
<ImageView
android: id="@+id/imageViewLaunch»
android: layout_width=«fill_parent»
android: layout_height=«fill_parent»
android: contentDescription="@string/desc»/>
<include layout="@layout/contents»/>
</ViewFlipper>
Где ViewFlipper-компонент обеспечивает переключение с начальной заставки ImageView на панель с кнопками, содержимое которой определяется компоновкой contents. xml:
<?xml version=«1.0» encoding=«utf-8»? >
<ScrollView xmlns: android="http://schemas.android.com/apk/res/android"
android: layout_width=«match_parent»
android: layout_height=«match_parent»>
<LinearLayout android: layout_width=«fill_parent»
android: baselineAligned=«false»
android: layout_height=«wrap_content»
android: orientation=«horizontal»>
<LinearLayout android: layout_height=«wrap_content»
android: id="@+id/linearLayout1»
android: orientation=«vertical»
android: layout_width=«0dip»
android: layout_weight=». 8»>
<TextView
android: id="@+id/contentsTitle»
android: layout_width=«fill_parent»
android: layout_height=«wrap_content»
android: text="@string/title»
android: textStyle=«bold»
android: textAppearance=»? android: attr/textAppearanceMedium»/>
<Button
android: gravity=«left|center_vertical»
android: id="@+id/button1»
android: layout_width=«fill_parent»
android: layout_height=«wrap_content»
android: text="@string/introduction» />
<Button
android: gravity=«left|center_vertical»
android: id="@+id/buttonn»
android: layout_width=«fill_parent»
android: layout_height=«wrap_content»
android: text="@string/chx» />
</LinearLayout>
<LinearLayout android: layout_width=«0dip»
android: layout_height=«wrap_content»
android: orientation=«horizontal»
android: id="@+id/linearLayout_dummy»
android: layout_weight=». 20»>
</LinearLayout>
</LinearLayout>
</ScrollView>
Кнопки панели разделов контента обеспечивают запуск другого Activity-компонента приложения, передавая ему в качестве параметра свой текст, для идентификации содержимого раздела, который нужно отображать:
import java.io.IOException;
import java.io.InputStream;
import android.app.Activity;
import android.content.Intent;
import android.graphics. drawable. Drawable;
import android. os. Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View. OnTouchListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
public class ContentActivity extends Activity {
private float fromPosition;
private int index;
private LinearLayout linearLayout;
private ImageView image;
@Override
protected void onCreate (Bundle savedInstanceState) {
super. onCreate (savedInstanceState);
setContentView(R.layout.activity_content);
String name=«title»;
String value=this.getIntent().getStringExtra (name);
linearLayout= (LinearLayout)findViewById(R.id.layoutContent);
image=(ImageView)findViewById(R.id.imageViewContent);
if (value. equals («Introduction»)) {
this.setTitle («Introduction»);
setContent (1,8,value);
}
if (value. equals («Chaptern»)) {
this.setTitle («Chaptern»);
setContent (1,xxx, value);
}
}
@Override
public boolean onCreateOptionsMenu (Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected (MenuItem item) {
switch (item.getItemId ()) {
case R.id.action_settings:
final Intent intent = new Intent (this, MainActivity.class);
startActivity (intent);
return true;
default:
return super. onOptionsItemSelected (item);
}}
private void setImage (String path) {
InputStream ims;
try {
ims = getAssets ().open (path);
Drawable d = Drawable.createFromStream (ims, null);
image.setImageDrawable (d);
} catch (IOException e) {
e.printStackTrace ();
}}
private void setContent (int start, int end, String path) {
final String pathContent=path;
final int endContent=end;
final int startContent=start;
index=startContent;
setImage(pathContent+"/"+index+".jpg»);
linearLayout.setOnTouchListener (new OnTouchListener () {
public boolean onTouch (View v, MotionEvent event) {
switch (event.getAction ())
{
case MotionEvent.ACTION_DOWN:
fromPosition = event.getX ();
break;
case MotionEvent.ACTION_UP:
float toPosition = event.getX ();
if (fromPosition> toPosition) {
index++;
if (index <=endContent) {
setImage(pathContent+"/"+index+".jpg»);
} else {
index=endContent;
}}
else if (fromPosition <toPosition) {
index – ;
if (index> =startContent) {
setImage(pathContent+"/"+index+".jpg»);
} else {
index=startContent;
}}
default:
break;
}
return true;
}
});
}}
В классе ContentActivity в методе onCreate () создается экран, содержимое которого определяется компоновкой activity_content. xml:
<LinearLayout xmlns: android="http://schemas.android.com/apk/res/android"
xmlns: tools="http://schemas.android.com/tools"
android: id="@+id/layoutContent»
android: layout_width=«match_parent»
android: layout_height=«match_parent»
android: orientation=«vertical»
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=".ContentActivity»>
<ImageView
android: id="@+id/imageViewContent»
android: layout_width=«fill_parent»
android: layout_height=«fill_parent»
android: contentDescription="@string/cont»/>
</LinearLayout>
ContentActivity-компонент, получая в качестве параметра текст кнопки панели компонента MainActivity, вызывает метод setContent (), в котором определяется переключение между изображениями соответствующей папки каталога assets проекта приложения.
Правообладателям!
Это произведение, предположительно, находится в статусе 'public domain'. Если это не так и размещение материала нарушает чьи-либо права, то сообщите нам об этом.