Android приложения прочно вошли в нашу жизнь. Мы каждый день ими пользуемся: картами, социальными сетями, мессенджерами, браузерами. Но каждый опытный пользователь смартфона на Android хоть раз задумывался о создании своего приложения. Сложился стереотип, что это очень сложно и нужно долго учить программирование, чтобы что-то качественное написать. Однако Google постоянно совершенствует свои инструменты разработки, делая их проще и удобнее. Сегодня мы создадим самое простое приложение для Android и запустим его на смартфоне.
Приложения для Android создаются на языке программирования Java. Сейчас как альтернатива Java продвигается еще и относительно новый более простой язык Kotlin (язык назван в честь острова? на котором расположен город Кронштадт). Наш пример будет на Java.
Сперва мы проверим, установлен ли на вашем компьютере (под управлением Windows) JDK. Java Development Kit – это комплект разработчика приложений от компании Oracle. Без него среда разработки не сможет правильно функционировать.
Для этого нажмите на клавиатуре Win + R. Введите cmd и нажмите Enter. Откроется командная строка. Далее в консоли необходимо набрать:
java -version
Скорее всего, вы увидите версию Java:
Это значит, что у вас уже установлен JDK. В противном случае его необходимо скачать (150 Мб).
После установки JDK переходим к основному инструменту разработки для ОС Android – Android Studio. Загрузить его можно здесь (944 Мб).
Android Studio – это свободно распространяемая среда разработки от Google. Это такой огромный комбайн для разработки приложений, в который вошли различные инструменты для тестирования, сборки приложений, а также шаблоны, удобный редактор макетов и многое другое. Android Studio постоянно обновляется, как и его многочисленные компоненты.
Версии Android Studio есть не только под Windows, но и для Mac OS и Linux. Системные требования для Android Studio: Windows 7/8/10, 3 Гб оперативной памяти минимум, 8 Гб RAM рекомендовано, 4 Гб на жестком диске.
Итак, вы скачали инсталлятор Android Studio.
Запускаем его.
Жмем Next, выбираем путь для установки. Настройки желательно не менять.
Затем запустится мастер настройки Android Studio. Здесь можно выбрать цветовую тему среды разработки, скачать дополнительные файлы. Тип установки выбираем стандартный.
После скачивания необходимых компонентов будет предложено выбрать тип вашего проекта. Выбираем Empty Activity и кликаем Next.
На следующем экране даем название проекту и выбираем, начиная с какой версии Android будет работать ваше приложение. Лучше всего выбрать – c Android 4.0.3 – так наше приложение будет работать на максимальном количестве устройств. Стоит отметить, что Android Studio настолько универсальна, что позволяет создавать приложения не только для смартфонов, но и для смарт-часов и телевизоров!
Далее у нас открывается основное окно Android Studio. Слева мы видим несколько разделов. Это структура нашего проекта. В папке manifests находится файл AndroidManifest.xml, который отвечает за информацию о приложении, импортируемые библиотеки, компоненты и другие параметры. В папке java находится непосредственно код (файл MainActivity в папке com.example.myapplication). В папке res находятся ресурсы приложения – кнопки, файлы, которые определяют дизайн интерфейса (например, activity_main.xml).
Acitivity – это отдельный экран, с которым взаимодействует пользователь. Примеры: экран с фото, набор номера, ввод текста. У нас будет один Acitivity (экран). Поэтому сразу идем по пути app – src – main – res – layout и открываем файл activity_main.xml. Переключаемся в режим Design.
Выбираем раздел Button и перетягиваем его на экран приложения. У нас появилась кнопка. Вводим текст на ней (kv.by).
Чтобы увеличить размер шрифта – переключаемся в режим Text и в коде в разделе Button добавляем такую строчку:
android:textSize="25sp"
В режиме Design жмем правой кнопкой мыши и выбираем Constrain, далее выбираем все пункты по очереди. Это «привяжет» вашу кнопку, чтобы она не могла сместиться.
Далее редактируем надпись Hello, World – меняем на свою собственную («Мое первое приложение на Android»).
Следующий этап – добавляем картинку. Сначала мы должны ее добавить в проект. Картинка будет к примеру, эта:
Скачайте ее и перетяните прямо в проект в папку res – drawable. Она добавится в проект. Теперь открываем activity_main.xml и переключаемся в режим Design. Выбираем Common – ImageView. Перетягиваем на наш экран. Откроется окно выбора картинки. Переходим в раздел Project. Там видим логотип kv.by. Выбираем его и помещаем в середине окна нашего приложения. На картинке также применяем Constrain.
В итоге у вас должен получится такой код activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:layout_width="145dp" android:layout_height="53dp" android:layout_marginTop="262dp" android:layout_marginBottom="416dp" android:gravity="center" android:text="Мое первое приложение на Android" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.552" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/button" android:layout_width="199dp" android:layout_height="113dp" android:text="kv.by" android:textSize="25sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" tools:layout_editor_absoluteY="114dp" /> <ImageView android:id="@+id/imageView" android:layout_width="216dp" android:layout_height="172dp" android:layout_marginStart="55dp" android:layout_marginLeft="55dp" android:layout_marginTop="380dp" android:layout_marginEnd="28dp" android:layout_marginRight="28dp" android:layout_marginBottom="51dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.495" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/logo" /> </android.support.constraint.ConstraintLayout>
И, соответственно, такой код MainActivity (в папке com.example.myapplication):
package com.example.myapplication; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapplication"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="App kv.by" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
А теперь пора проверить, все ли работает. Проверим на виртуальном смартфоне прямо у вас на компьютере.
Жмем вверху Tools – AVD Manager – Create Virtual Device.
Мы создаем виртуальное устройство (смартфон) под управлением Android. Выбираем Nexus 5X. Скачиваем сам эмулятор Android. Жмем Next. После всех манипуляций у вас в списке виртуальных устройств должен появиться «смартфон» Nexus 5X.
Теперь запустим приложение на виртуальном смартфоне – Run – Run app.
Появится окно с выбором, на чем необходимо его протестировать. Разумеется, выберем Nexus 5X.
На смартфоне открываем список приложений и ищем там App kv.by
Вот что получилось:
Работает! Приложение готово. Теперь можно и на ваш реальный смартфон его загрузить.
Чтобы установить на смартфон наше первое приложение – нужно создать apk-файл. APK – Android Package Kit, это такой незашифрованный zip-архив, в котором содержатся скомпилированный код приложения, файлы ресурсов, файлы манифеста и другая информация. Именно в формате apk хранятся файлы в Google Play, из которого мы скачиваем приложения.
Поскольку они не зашифрованы, картинки и некоторую другую информацию можно легко извлечь из любых приложений. Для этого есть ресурс APKMirror.com. На нем можно скачать apk-файл нужного приложения из Google Play. Затем переименовать его в *.zip и открыть любым архиватором. Там можно увидеть структуру приложения, иконки, графику. Например, вот как выглядит приложение WhatsApp изнутри:
Apk-файлы можно скачивать себе на смартфон или обмениваться ими. Либо установить в качестве приложения. Это удобно и дает некоторую свободу.
Для того, чтобы установить apk на вашем смартфоне, нужно сначала это разрешить. Идем в Настройки – Приложения – Особые права доступа – Установка неизв. приложений и там выбираем «Разрешено» для вашего файлового менеджера (например, Total Commander).
Итак, наша задача сделать apk-файл из кода, который мы написали. Для этого в Android Studio выбираем Build – Build Bundle / APK – Build APK. Запустится скрипт для создания apk. В конце вам предложат открыть папку в которой будет apk-файл. Далее необходимо подключить смартфон к компьютеру и скопировать полученный apk-файл в память телефона. Затем уже на смартфоне открыть файловым менеджером папку с файлом и установить его. Теперь у вас собственное приложение в смартфоне!
Если вас заинтересовала эта тема – вы можете ознакомиться с исходным кодом некоторых простейших приложений на GitHub. Например, там есть галерея и файловый менеджер. Вы можете редактировать их код под собственные нужды. Много информации о разработке под Android вы также можете найти здесь.
![Версия для печати Версия для печати](https://www.kv.by/sites/all/modules/print/icons/print_icon.png)
Комментарии
Страницы
Фрагмент живёт своей жизнью. Но когда в нём что-то случается, бывает, надо сообщить об этом в хозяйку-активити. Проще всего это сделать через коллбэк. Для этого в теле фрагмента добавляем: 1) приватный член fragmentCallBack типа FragmentCallBack, 2) публичный интерфейс FragmentCallBack, содержащий сам коллбэк void callBack(...), 3) публичную функцию-установщик колбэка:
public void setFragmentCallBack(FragmentCallBack fragmentCallBack) { this.fragmentCallBack = fragmentCallBack; }
4) ну, и сам вызов fragmentCallBack.callBack(...) в нужное нам место фрагмента.
В хозяйке-активити 5) добавляем реакцию на вызов: private void setCallBack(){ объект_фрагмента.setFragmentCallBack(... -> действия } и 6) добавляем реакцию setFragmentCallBack() в последовательность действий при создании фрагмента.
Теперь при вызове callBack(...) внутри фрагмента его хозяйка выполнит нужные нам действия. Многоточие -- это параметры, которые фрагмент передаёт в хозяйку.
Может, кому-то пригодится.
Как создать дочерний фрагмент, вызываемый из родительского фрагмента?
1. Создаём новый лейаут: res->layout->new->Layout Resourse File и обзываем, например, fragment_summary.xml. 2. Рисуем в дизайнере шаблон дочернего фрагмента, добавляя компоненты из палитры студии. 3. Не нужно создавать новый фрагмент средствами студии через Java->Проект->New->Fragment ! Студия не даст подключить созданный шаблон дочернего фрагмента и потребует создать шаблон нового фрагмента! А нужно создать новый java-класс через Java->Проект->New->Java Class и поименовать его по своему усмотрению. 4. После имени класса обязательно надо добавить extends Fragment, т.е. указать, что новый класс является потомком класса Fragment. 5. В конструкторе нового класса необходимо добавить строчку super(R.layout.имя_xml-шаблона), что связывает код дочернего фрагмента с его шаблоном. 6. Возвращаемся к дереву компонентов шаблона родительского фрагмента. В лейаут шаблона родительского фрагмента из палитры студии вставляем компонент FragmentContainerView. Студия выставляет окно перечисления фрагментов, имеющихся в проекте, кликаем по созданному дочернему фрагменту, что вставляет дочерний фрагмент в родительский. 7. Именуем контейнер дочернего фрагмента и делаем его членом класса родительского фрагмента. 8. Добавляем в родительский фрагмент контрол вызова дочернего фрагмента и работаем с кодом дочернего фрагмента.
Может, кому-то пригодится.
Обнаружил засаду с дочерними фрагментами: одни дочерние фрагменты после создания в коде не требуют операции bringToFront() над своими контейнерами, а другие требуют. В стековерфлоу говорят о неком баге, советуют много ненужного, но если каждый раз после реплейса и коммита дочернего фрагмента выполнять bringToFront(), то всё работает.
Может, кому-то пригодится.
С набором опыта признаЮ, что простой перенос опыта по разработке UI для десктопных приложений на разработку приложений мобильных -- это ошибка. Для мобилки чрезвычайно важен UX. Пользователь не должен гадать, что ему делать, чтобы раскрывать возможности мобильного приложения. Пример.
Экран, на нём ресайклер (это такой скроллируемый ряд визуальных данных) и с ним надо работать: что-то удалять, что-то добавлять, вызывать доп. данные и т.д. Конечно, можно к чему-то приделать контекстное меню, вызываемое длинным тапом. А можно на экран добавить Floating Access Button, тап по которой вызывает боковое меню.
В первом случае юзер, скорее всего, не догадается сделать длинный тап по некому контролу, а во втором случае обязательно тиснет FAB. Хотя бы из любопытства.
Ну, по теме можно написать не одну статью.
Короче, надо знать Material Design.
В очередной раз пропатчил студию, добавил в сборщик все рекомендации, и трындец: проект перестал собираться с выдачей сообщения о дубляже классов в джарах. После удаления в зависимостях строки implementation 'org.jetbrains:annotations-java5:15.0' сборка снова заработала.
Может, кому пригодится.
Дизайнер студии не всегда может вычислить атрибуты размещения вьюшек. Пример.
Фрагмент, в нём: xml-чердак фиксированной высоты с вьюшками, ресайклер и xml-подвал с вьюшками -- классическая компоновка! Высота ресайклера -- 0dp, т.е. он размещён между подвалом и чердаком. Высота подвала определяется содержанием, и он привязан ко дну экрана. Дизайнер не показывает ошибок, собираем... И tout à coup: нельзя разместить подвал! Стековерфлоу веселит: ответы на ошибку сводились к "только Бог поможет". Решение: подвал тоже должен иметь фиксированную высоту, несмотря на фиксированность высоты подвальных вьюшек. Видимо, в дизайнере компоновки калькулятор атрибутов размещения не работает при >3 итераций.
Чтобы подвал имел плавающую высоту -- делайте подвал программно.
Может, кому пригодится.
В принципе, не обязательно делать лейаут-контейнеры для чердака и подвала. Помогают и горизонтальные гайдлайны. Но гайдлайн чердака нужно отсчитывать от верха главного лейаута экрана, а гайдайн подвала -- от низа. К гайдлайнам и привязываются вьюшки чердака и подвала. При этом к гайдлайну чердака привязываются низы вьюшек чердака, а к гайдлайну подвала -- топы вьюшек подвала.
Аналогично и для вертикальных гайдлайнов, учитывая лево-право. Эти нехитрые приёмы позволяют избегать расчётов для разных размеров экранов.
Обновил студию до Дельфина. Полёт пока нормальный, но сборщик стал работать ещё медленнее. По ср. с моментом публикации статьи субъективно раза в два. Анализатор кода стал умнее -- даже за отступами следит, заставляя наводить красоту. Если после условия, несмотря на фигурные скобки в Джаве, не сделать отступ -- ошибка! :) Правда, такая строгость давится аннотациями.
Ага. Пока не включил дизайнер. Режим "дизайн не работает, работает только "блупринт", но вырубается при редактировании xml-кода, после чего приходится перещёлкивать java-xml, чтобы посмотреть, как изменения xml-кода отразились в графике. Такого говна не ожидал!..
А, понял. Раньше некритические красные ошибки компоновки дизайнер проглатывал, теперь нет. Пример некритической красной ошибки: не определён текст при заданном размере вьюшки. Такие ошибки надо или исправлять, или подавлять. Но бывают некритические красные ошибки, которые давятся только в текущей сессии студии, и после рестарта студии подавление исчезает. Пример такой ошибки: на этапе дизайна не определён фрагмент в контейнере (на самом деле он определяется программно).
Похоже, со строгостью контроля дизайна разработчики перестарались.
Может, кому пригодится.
Впрочем, Дельфин порадовал значительным улучшением дебаггера. Теперь работа приложения под дебаггером стала очень устойчивой и почти такой же быстрой, как и без дебаггера, а подключения дебаггера к приложению на лету уже перестали слетать, как бывало прежде.
Правда, БД бОльшая, чем 2,56 Мб по-прежнему не панорамится, а в инспекторе её просматривать неудобно, из-за чего её приходится выгружать на внешний просмотрщик, что не динамично.
Страницы