- Tutorial
Здравствуйте. Сегодня на глаза попался пост о курсе программирования под Android на сайте Linux Foundation, а вместе с ним - и немало комментариев о том, что хотелось бы видеть и перевод этих уроков. Поскольку я сейчас, после четырех лет разработки под микроконтроллеры, начал изучать и программирование для мобильных устройств, то параллельно решил сделать перевод первой части урока.
Программирование под Android для начинающих. Часть 1
Смартфоны и планшеты на Android все чаше встречаются в наших сумках и карманах, и программирование под Android также становится все популярнее. Это отличная платформа для разработки - API прекрасно документирован и прост в использовании, да и просто интересно создать что-то, что вы cможете запустить на своем смартфоне. Изначально вы можете обойтись и без него, создав и протестировав код с помощью эмулятора на вашем Linux ПК. В первой из двух частей этого введения объясняется как создать простое приложение с таймером, а также даются начальные сведения о Android API. Курс подразумевает наличие начальных представлений о Java, XML и технологиях программирования, но тем не менее не стесняйтесь попробовать даже если вы имеете об этом очень смутное представление.Начало работы и среда разработки
Немного о версиях: последней версией Android является 4.2 (Jelly Bean), но, как можно выдеть по этой диаграмме , она еще недостаточно распространена. Лучше всего начинать разработку под одну из версий: 4.0 (Ice Cream Sandwich) или 2.3 (Gingerbeard), особенно с учетом того, что версии Android поддерживают обратную совместимость (т.е. ваш код для версии 2.3 будет работать и на 4.2), а приложения, разработанные для более поздней версии, не всегда будут работать и на старой. Приведенный здесь код должен работать на версиях 4.0 и 2.3.Простейший способ получить среду разработки - установить Android Bundle, который можно скачать . Также вам понадобится JDK 6 (не только JRE). Не забудьте что Android не совместим с gcj. Если вы уже используете Eclipse или другую IDE, то вы можете попробовать настроить ее под Android. Как это сделать - описано . Теперь создайте проект под именем Countdown с помощью Eclipse , или из командной строки . Я установил в настройках BuildSDK 4.0.3 и minimum SDK 2.2, и (в Eclipse) использовал шаблон BlankActivity.
Мой первый проект под Android: интерфейс
Первой нашей программой под Android будет таймер, показывающий обратный отсчет от 10 секунд после нажатия кнопки. Прежде чем писать код, нужно создать интерфейс - то, что пользователь увидит, запустив наше приложение. Нужно открыть res/layout/activity_countdown.xml и создать XML шаблон - с помощью редактора Eclipse или текстового/XML редактора ввести следующее:Обратите внимание на string /start и string /__00_30. Их значения будут расположены в res/values/strings.xml:
Это общепринятый способ обращения к ресурсам в Android: лучше использовать ссылки на строковые переменные, чем жестко заданные строки.
Мой первый проект под Android: код
Теперь откроем в редакторе файл CountdownActivity.java - и мы готовы писать код нашего приложения. Вы должны увидеть автоматически сгенерированную «заглушку» метода onCreate(). Он всегда вызывается как только создается объект Activity, и в него вы можете поместить какие-либо функции, которые должны выполняться при запуске приложения. (Eclipse также может создать пустой метод onCreateOptionsMenu(), но мы пока не будем обращать на него внимания). Введите следующий код:public class CountdownActivity extends Activity { private static final int MILLIS_PER_SECOND = 1000; private static final int SECONDS_TO_COUNTDOWN = 30; private TextView countdownDisplay; private CountDownTimer timer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_countdown); countdownDisplay = (TextView) findViewById(R.id.time_display_box); Button startButton = (Button) findViewById(R.id.startbutton); startButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { try { showTimer(SECONDS_TO_COUNTDOWN * MILLIS_PER_SECOND); } catch (NumberFormatException e) { // method ignores invalid (non-integer) input and waits // for something it can use } } }); } }
Вы видите как просто оказалось создать наш первый проект: Android API включает в себя CountDownTimer, который мы можем использовать. Мы объявили его и поле отображения обратного отсчета как закрытые (private) свойства класса Activity. В методе onCreate() мы использовали метод setContentView, чтобы подключить наш XML-шаблон. Такой R.foo.bar синтаксис - это стандартный способ обращения к XML-ресурсам в Android, и мы встретимся с ним еще много раз.
findViewById - это еще один метод, который вы будете часто использовать. Здесь он возвращает ссылки на поле вывода таймера и кнопку Start, описанные в XML-шаблоне. Для кнопки, чтобы мы могли обработать ее нажатие, должен быть задан «перехватчик» OnClickListener, и его метод onClick(). Здесь он просто вызывает метод showTimer() c заданным числом миллисекунд (сейчас жестко заданным в коде).
Итак, что делает showTimer():
private void showTimer(int countdownMillis) {
if(timer != null) { timer.cancel(); }
timer = new CountDownTimer(countdownMillis, MILLIS_PER_SECOND) {
@Override
public void onTick(long millisUntilFinished) {
countdownDisplay.setText("counting down: " +
millisUntilFinished / MILLIS_PER_SECOND);
}
@Override
public void onFinish() {
countdownDisplay.setText("KABOOM!");
}
}.start();
}
Класс CountDownTimer делает за нас почти всю работу, что очень приятно. В начале мы проверяем, существует ли уже таймер, и, если он есть, то сбрасываем его. Далее мы создаем новый таймер с заданным числом миллисекунд для обратного отсчета (из параметра метода showTimer()) и с заданным числом миллисекунд между интервалами отсчета. По истечении времени между интервалами вызывается метод onTick().
CountDownTimer - абстрактный класс, и методы __onTick() и __onFinish() должны быть реализованы в его подклассе. Мы переопределяем метод onTick(), уменьшающий выводимое число на единицу по истечении каждого интервала, и метод onFinish(), выводящий на дисплей сообщение о окончании обратного отсчета. Потом start() запускает таймер.
С помощью команды «Run» в Eclipse вы можете запустить созданное приложение, при этом будет автоматически запущен эмулятор Android. Посмотрите документацию по Android если вы хотите узнать больше о
Многие программисты хотят заняться разработкой приложений под Android. Но немногие представляют, какие шаги здесь надо предпринять. Эта подборка призвана помочь новичкам в освоении Android-разработки.
Начало работы
Новичкам в программировании поможет наша .
Для новичков в Android Google сделал хорошее введение в Android на своём сайте. Также есть замечательный краудсорсинговый гид по Android . Кроме того, есть курс от Google на Udacity.
Если у вас возникают проблемы с Android , крайне рекомендуется сперва проверить StackOverflow . Он создан для ответов на технические вопросы и даже является .
Вы всегда можете найти у нас на сайте.
FAQ
Я хочу начать разрабатывать под Android. С чего мне начать?
Первый и важнейший шаг в разработке под Android – это изучение Java и XML. Как только вы более менее познакомитесь и с тем, и с другим, изучите официальную Документацию по Android и пройдите несколько уроков, пока не почувствуете себя достаточно уверенным для создания собственных проектов. Удачи!
Нужно ли мне Android-устройство для разработки?
Вы можете писать приложения без какого-либо Android-устройства, используя включённый в поставку эмулятор (или усовершенствованный Genymotion). Однако для учёта аппаратных требований ничто не заменит тестирование на настоящем устройстве.
Какую IDE мне лучше использовать?
- Android Studio - официально поддерживаемая IDE для разработки под Android. Именно она используется в современных руководствах и видео, в том числе и от Google.
- Eclipse была основной IDE для разработки под Android на протяжении многих лет, поэтому большинство устаревших уроков, ресурсов, видео и скриншотов сделаны на ней.
- IntelliJ IDEA был альтернативой Eclipse, но в настоящее время разумнее начать с Android Studio. Android Studio – это ответвление IntelliJ IDEA, так что вы получите все её преимущества плюс бонусы под Android.
Может, мне стоит забыть про Java и начать учить Kotlin?
Google теперь официально поддерживает Kotlin как язык разработки под Android, но это не значит, что про поддержку Java можно забыть. В ближайшем обозримом будущем документация, инструменты, новые фичи платформы будут поддерживать как Kotlin, так и Java. Хотя Kotlin - более молодой язык с некоторыми приятными особенностями, вы всё ещё можете создавать отличные приложения на Java. Выбор зависит только от вас, но если вам не принципиально или вы новичок, то, возможно, лучше сделать выбор в пользу Kotlin.
Ресурсы
Здесь представлены основные ресурсы по обучению разработке под Android на английском языке. Это далеко не полный список, но достаточный для старта.
Официальные ресурсы Android
Дизайн
- Красивости для Android – вдохновение для создания графических интерфейсов под Android.
Рассылки
- Android Weekly – замечательная рассылка, помогающая быть в курсе последних разработок Android.
Коллекции библиотек
Инструменты
- Genymotion – крайне полезный и функциональный эмулятор.
- Android Asset Studio – отличная коллекция инструментов для создания/редактирования иконок, изображений и т.д.
- Codota Plug-in для Android Studio – замечательные примеры кода прямо в Android Studio.
Примеры open source приложений
Идеи для приложений
Итак, у вас есть идея для приложения… Люди каждый день об этом пишут. Но перед тем, как просить помощи в реализации проекта, нужно ответить на следующие ключевые вопросы:
Каков мой бюджет?
Если вы настроены серьёзно и хотите выпустить свой продукт, вы должны подумать о своём бюджете. Даже в случае простого приложения нужно подумать о нескольких тысячах долларов. Хотя бы.
Какая у меня маркетинговая стратегия?
Вы собираетесь использовать обычное сарафанное радио или готовы платить за известность?
Какой список задач у данного проекта?
А также, какие есть ограничения? Сколько мне нужно разработчиков?
Откуда будут приходить/где будут храниться данные?
А также, как они будут использоваться? Разработана ли у меня соответствующая политика приватности?
Есть ли цель заработать денег?
Если да, как вы собрались её достигать? Через рекламу, IAP , подписки, платные приложения? Всё вышеперечисленное?
Как вы будете платить вашим разработчикам?
Есть ли у вас капитал или вы собрались платить им после того, как приложение начнём приносить доход? Часто независимые контрактники требуют часть полной стоимости авансом. Большинству разработчиков неинтересно разделение доходов, за исключением случаев, когда они сами вкладываются в приложение.
Какой будет способ тестирования?
На какой тип устройства вы собираетесь устанавливать его? Как много итераций вам нужно? Каких людей вы хотите вовлечь?
Как скоро вы хотите опубликовать приложение в магазине?
Это однозначно повлияет на конечный доход.
Будете ли вы требовать или предлагать регистрацию/интеграцию с социальными сетями?
Продумайте реализацию этой функциональности.
Какова ваша целевая аудитория?
Это нишевое приложение или оно может быть распространено повсюду?
Реализована ли уже моя идея?
Если да, как я могу улучшить её или что в ней отсутствует?
Что делать с идеями для приложений, если вы не разработчик?
Вы, возможно, ищете разработчиков в вашу команду для реализации приложения. Если у вас есть деньги и вы можете заплатить разработчику или фирме, то всё просто и понятно. Далее мы поговорим о том, что делать, если у вас недостаточно денег, чтобы платить кому-то.
Осознайте, что ваша идея может быть не уникальна, а разработка требует значительных усилий.
- Нарисуйте дизайн вашего приложения (внешний вид и функциональность). Он может быть грубым и нарисован на бумаге. Но он должен быть достаточно конкретным, а не размытым.
- Составьте список своих навыков, связанных с идеей.
- Составьте список того, что вы вложите в свою идею.
Поймите, что разработка требует значительных усилий. Представьте, что разработчик работает полный рабочий день (8 часов) на протяжении 2 месяцев, чтобы создать ваше приложение. И вы также работаете полный рабочий день. Что вы делаете в это время? Если ваша работа, по вашим представлениям, заканчивается раньше, то нужно пересмотреть идею. В этом сценарии разработчик выполняет большую часть работы, и вы, честно говоря, бесполезны. То, что вы можете дать после того, как приложение закончено, не имеет особого значения и не будет мотивировать разработчика заканчивать продукт.
Пересмотр вашей идеи
Если разработчик выполняет больше работы, чем вы, нужно пересмотреть идею, чтобы распределить работу более справедливо. Это даст преимущества от совместной работы. Посмотрите на ваш список навыков и подумайте, как их можно применить. Это нормально, если приложение будет отличаться от начальной задумки. Пересматривайте его до тех пор, пока количество вашей работы и работы разработчика, как минимум, не сравняются.
- Распределяйте работу настолько справедливо, насколько это возможно.
- Фокусируйтесь прежде всего на ваших навыках.
- Ваша загрузка должна примерно равняться 2 месяцам полноценной работы. Для простых приложений загрузка, конечно, может быть меньше. Вы можете попросить сообщество (например,
В любом деле самое сложное - это начало. Часто бывает тяжело войти в контекст, с чем столкнулся и я, решив разработать свое первое Android-приложение. Настоящая статья для тех, кто хочет начать, но не знает с чего.
Статья затронет весь цикл разработки приложения. Вместе мы напишем простенькую игру “Крестики-Нолики” с одним экраном (в ОС Android это называется Activity).
Отсутствие опыта разработки на языке Java не должно стать препятствием в освоении Android. Так, в примерах не будут использоваться специфичные для Java конструкции (или они будет минимизированы на столько, на сколько это возможно). Если Вы пишете, например, на PHP и знакомы с основополагающими принципами в разработке ПО, эта статья будет вам наиболее полезна. В свою очередь так как, я не являюсь экспертом по разработке на Java, можно предположить, что исходный код не претендует на лейбл “лучшие практики разработки на Java”.
Установка необходимых программ и утилит
Перечислю необходимые инструменты. Их 3:
- IDE c поддержкой разработки для Android:
- Eclipse + ADT plugin;
- IntelliJ IDEA Community Edition;
- Netbeans + nbandroid plugin;
Утилиты устанавливаются в определенном выше порядке. Ставить все перечисленные IDE смысла нет (разве только если Вы испытываете затруднения с выбором подходящей). Я использую IntelliJ IDEA Community Edition, одну из самых развитых на данный момент IDE для Java.
Запуск виртуального устройства
Запустив AVD Manager и установив дополнительные пакеты (SDK различных версий), можно приступить к созданию виртуального устройства с необходимыми параметрами. Разобраться в интерфейсе не должно составить труда.Список устройств
Создание проекта
Мне всегда не терпится приступить к работе, минимизируя подготовительные мероприятия, к которым относится создание проекта в IDE, особенно, когда проект учебный и на продакшн не претендует.Итак, File->New Project:
По нажатию кнопки F6 проект соберется, откомпилируется и запустится на виртуальном девайсе.
Структура проекта
На предыдущем скриншоте видна структура проекта. Так как в этой статье мы преследуем сугубо практические цели, заострим внимание лишь на тех папках, которые будем использовать в процессе работы. Это следующие каталоги: gen , res и src .В папке gen находятся файлы, которые генерируются автоматически при сборке проекта. Вручную их менять нельзя.
Папка res предназначена для хранения ресурсов, таких как картинки, тексты (в том числе переводы), значения по-умолчанию, макеты (layouts).
src - это папка в которой будет происходить основная часть работы, ибо тут хранятся файлы с исходными текстами нашей программы.
Первые строки
Как только создается Activity (экран приложения), вызывается метод onCreate(). IDE заполнила его 2 строчками:
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Метод setContentView (равносильно this.setContentView) устанавливает xml-макет для текущего экрана. Далее xml-макеты будем называть «layout», а экраны - «Activity». Layout в приложении будет следующий:
Для этого приложения идеально подойдет TableLayout. Id можно присвоить любому ресурсу. В данном случае, TableLayout присвоен id = main_l. При помощи метода findViewById() можно получить доступ к виду:
private TableLayout layout; // это свойство класса KrestikinolikiActivity
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
layout = (TableLayout) findViewById(R.id.main_l);
buildGameField();
}
Теперь необходимо реализовать метод buildGameField(). Для этого требуется сгенерировать поле в виде матрицы. Этим будет заниматься класс Game. Сначала нужно создать класс Square для ячеек и класс Player, объекты которого будут заполнять эти ячейки.
Square.java
package com.example; public class Square { private Player player = null; public void fill(Player player) { this.player = player; } public boolean isFilled() { if (player != null) { return true; } return false; } public Player getPlayer() { return player; } }Player.java
package com.example; public class Player { private String name; public Player(String name) { this.name = name; } public CharSequence getName() { return (CharSequence) name; } }Все классы нашего приложения находятся в папке src.
Game.java
package com.example; public class Game { /** * поле */ private Square field; /** * Конструктор * */ public Game() { field = new Square; squareCount = 0; // заполнение поля for (int i = 0, l = field.length; iИнициализация Game в конструкторе KrestikinolikiActivity.
public KrestikinolikiActivity() {
game = new Game();
game.start(); // будет реализован позже
}
Метод buildGameField() класса KrestikinolikiActivity. Он динамически добавляет строки и колонки в таблицу (игровое поле):
private Button buttons = new Button;
//(....)
private void buildGameField() {
Square field = game.getField();
for (int i = 0, lenI = field.length; i
В строке 8 создается объект, реализующий интерфейс View.OnClickListener. Создадим вложенный класс Listener. Он будет виден только из KrestikinolikiActivity.
public class Listener implements View.OnClickListener {
private int x = 0;
private int y = 0;
public Listener(int x, int y) {
this.x = x;
this.y = y;
}
public void onClick(View view) {
Button button = (Button) view;
}
}
Осталось реализовать логику игры.
public class Game {
/**
* игроки
*/
private Player players;
/**
* поле
*/
private Square field;
/**
* начата ли игра?
*/
private boolean started;
/**
* текущий игрок
*/
private Player activePlayer;
/**
* Считает колличество заполненных ячеек
*/
private int filled;
/**
* Всего ячеек
*/
private int squareCount;
/**
* Конструктор
*
*/
public Game() {
field = new Square;
squareCount = 0;
// заполнение поля
for (int i = 0, l = field.length; i
Определение победителя
К. О. подсказывает, что в крестики-нолики выирывает тот, кто выстроет X или O в линию длиной, равной длине поля по-вертикали, или по-горизонтали, или по-диагонали. Первая мысль, которая приходит в голову - это написать методы для каждого случая. Думаю, в этом случае хорошо подойдет паттерн Chain of Responsobility. Определим интерфейсpackage com.example; public interface WinnerCheckerInterface { public Player checkWinner(); }
Так как Game наделен обязанностью выявлять победителя, он реализует этот интерфейс. Настало время создать виртуальных «лайнсменов», каждый из которых будет проверять свою сторону. Все они реализует интерфейс WinnerCheckerInterface.
WinnerCheckerHorizontal.java
package com.example; public class WinnerCheckerHorizontal implements WinnerCheckerInterface { private Game game; public WinnerCheckerHorizontal(Game game) { this.game = game; } public Player checkWinner() { Square field = game.getField(); Player currPlayer; Player lastPlayer = null; for (int i = 0, len = field.length; iWinnerCheckerVertical.java
package com.example; public class WinnerCheckerVertical implements WinnerCheckerInterface { private Game game; public WinnerCheckerVertical (Game game) { this.game = game; } public Player checkWinner() { Square field = game.getField(); Player currPlayer; Player lastPlayer = null; for (int i = 0, len = field.length; iWinnerCheckerDiagonalLeft.java
package com.example; public class WinnerCheckerDiagonalLeft implements WinnerCheckerInterface { private Game game; public WinnerCheckerDiagonalLeft(Game game) { this.game = game; } public Player checkWinner() { Square field = game.getField(); Player currPlayer; Player lastPlayer = null; int successCounter = 1; for (int i = 0, len = field.length; iWinnerCheckerDiagonalRight.java
package com.example; public class WinnerCheckerDiagonalRight implements WinnerCheckerInterface { private Game game; public WinnerCheckerDiagonalRight(Game game) { this.game = game; } public Player checkWinner() { Square field = game.getField(); Player currPlayer; Player lastPlayer = null; int successCounter = 1; for (int i = 0, len = field.length; iПроинициализируем их в конструкторе Game:
//(....) /** * "Судьи" =). После каждого хода они будут проверять, * нет ли победителя */ private WinnerCheckerInterface winnerCheckers; //(....) public Game() { //(....) winnerCheckers = new WinnerCheckerInterface; winnerCheckers = new WinnerCheckerHorizontal(this); winnerCheckers = new WinnerCheckerVertical(this); winnerCheckers = new WinnerCheckerDiagonalLeft(this); winnerCheckers = new WinnerCheckerDiagonalRight(this); //(....) }
Реализация checkWinner():
public Player checkWinner() { for (WinnerCheckerInterface winChecker: winnerCheckers) { Player winner = winChecker.checkWinner(); if (winner != null) { return winner; } } return null; }
Победителя проверяем после каждого хода. Добавим кода в метод onClick() класса Listener
public void onClick(View view) { Button button = (Button) view; Game g = game; Player player = g.getCurrentActivePlayer(); if (makeTurn(x, y)) { button.setText(player.getName()); } Player winner = g.checkWinner(); if (winner != null) { gameOver(winner); } if (g.isFieldFilled()) { // в случае, если поле заполнено gameOver(); } }
Метод gameOver() реализован в 2-х вариантах:
private void gameOver(Player player) { CharSequence text = "Player \"" + player.getName() + "\" won!"; Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); game.reset(); refresh(); } private void gameOver() { CharSequence text = "Draw"; Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); game.reset(); refresh(); }
Для Java, gameOver(Player player) и gameOver() - разные методы. Воспользовавшись Builder"ом Toast.makeText, можно быстро создать и показать уведомление. refresh() обновляет состояние поля:
private void refresh() { Square field = game.getField(); for (int i = 0, len = field.length; i
Готово! Надеюсь, эта статья помогла Вам освоиться в мире разработки под OS Android. Благодарю за внимание!
Видео готового приложения
Создавать собственные программы для мобильных устройств — это сложная задача, справится с которой можно используя специальные оболочки для создания программ для Андроид и имея элементарные навыки в программировании. Причем выбор среды создания мобильных приложений не менее важен, так как программа для написания программ на Андроид может значительно упростить процесс разработки и тестирования Вашего приложения.
Android Studio - интегрированная программная среда, созданная корпорацией Google. Если рассматривать другие программы, то Андроид Студио выгодно отличается от своих аналогов за счет того, что этот комплекс адаптирован для разработки приложений для Андроид, а также исполнения разного рода тестов и диагностики. Например, Android Studio в своем составе имеет инструменты для тестирования совместимости написанных Вами приложений с разными версиями Андроид и разными платформами, а также инструменты для проектирования мобильных приложений и просмотра изменений, практически в тот же миг. Также впечатляет поддержка систем контроля версий, консоли разработчика и множество стандартных шаблонов базового дизайна и стандартных элементов для создания Андроид приложений. К огромному множеству преимуществ можно еще и прибавить то, что распространяется продукт абсолютно бесплатно. Из минусов - это только англоязычный интерфейс среды.
RAD Studio
Новая версия RAD Studio под названием Berlin — это полноценный инструмент разработки кроссплатформенных приложений, в том числе и мобильных программ, на языках Object Pascal и C++. Его главное преимущество перед другими аналогичными программными средами состоит в том, что он позволяет очень быстро вести разработку за счет использования облачных сервисов. Новые наработки этой среды позволяют режиме реального времени видеть результат выполнения программы и все процессы, происходящие в приложении, что позволяет говорить о точности разработки. Также здесь можно гибко переключаться с одной платформы на другую или на серверные сервисы. Минус RAD Studio Berlin — это платная лицензия. Но при регистации можно получить бесплатную триал-версию продукта на 30 дней. Интерфейс среды — английский.
Eclipse - одна из самых популярных программных платформ с открытым кодом для написания приложений, в том числе и мобильных. Среди главных преимуществ Eclipse - огромный набор API, для создания программных модулей и использование RCP подхода, позволяющего написать практически любое приложение. Также эта платформа предоставляет пользователям такие элементы коммерческих IDE как удобный редактор с подсветкой синтаксиса, отладчик, работающий в потоковом режиме, классовый навигатор, менеджеры файлов и проектов, системы контроля версий, рефакторинг кода. Особо радует и возможность доставить нужные для написания программы SDK. Но для использования Eclipse также придется выучить английский язык.
Учтите, что студия постоянно обновляется, поэтому внешний вид окон и другие детали могут отличаться от данного примера. Большинство уроков на сайте сейчас используют версию 2.3. 25 октября 2017 года вышла версия 3.0, в которой многое поменялось. В этой статье я постарался заменить все картинки под новую версию.
В качестве языка программирования для Android используется Java. Для создания пользовательского интерфейса используется XML.
Здесь следует сделать небольшое отступление. В Android Studio 3.0 добавлена полноценная поддержка нового языка Kotlin, разработанная котанами. Google объявила о своих планах сделать новый "кошачий" язык основным. Но вы должны понимать, что за предыдущие годы было написано огромное количество примеров на Java. Если вы новичок в программировании, то лучше в первый период обучения полностью сосредоточиться на Java, вам будет проще находить ответы на вопросы. Kotlin от вас никуда не денется, перейти потом на него будет проще, а вот обратный процесс будет проходить тяжелее. Когда немного освоитесь в Java, то можете параллельно изучать примеры на Kotlin. Google сейчас активно переписывает документацию под Kotlin, но до полного перехода ещё далеко, даже меньше 50%. Чуть позже я также буду делать уроки под Kotlin, но это будет не скоро.
По традиции, заложенной в прошлом веке, каждый программист должен был написать «Hello World!» (Здравствуй, Мир!) в качестве первой программы. Времена меняются, и программа «Hello World!» уже встроена в среду разработки под Android в целях совместимости, а современные программисты должны писать программу Hello Kitty! (Привет, киска!). Согласитесь, что здороваться с котёнком имеет больше здравого смысла, чем с каким-то миром.
Поэтому разобьём задачу на две части. Сначала запустим готовую программу без написания кода, чтобы убедиться, что весь инструментарий корректно установился, и мы можем создавать и отлаживать программы. А потом уже напишем свою первую программу.
Создание нового проекта
Запускаем Студию и выбираем File | New | New Project... . Появится диалоговое окно мастера.
Поле Application name - понятное имя для приложения, которое будет отображаться в заголовке приложения. По умолчанию у вас уже может быть My Application . Заменим на . В принципе вы могли написать здесь и Здравствуй, мир! , но у Android есть замечательная возможность выводить нужные строки на телефонах с разными языками. Скажем, у американца на телефоне появится надпись на английском, а у русского - на русском. Поэтому в первоначальных настройках всегда используются английские варианты, а локализованные строки подготовите позже. Необходимо сразу вырабатывать привычку к правильному коду.
Поле Company Domain служит для указания вашего сайта. По умолчанию там может появиться ваше имя как пользователя компьютера. Если сайт у вас есть, то можете ввести его адрес, либо придумайте какое-нибудь название. Введённое имя запоминается и будет автоматически подставляться в следующих новых проектах. Экономия, однако.
Третье поле Project location позволяет выбрать место на диске для создаваемого проекта. Вы можете создать на своём диске отдельную папку для своих проектов и хранить свои программы в ней. Студия запоминает последнюю папку и будет автоматически предлагать сохранение в ней. В случае необходимости вы можете задать другое местоположение для отдельного проекта через кнопку с тремя точками.
Поле Package name формирует специальный Java-пакет на основе вашего имени из предыдущего поля. В Java используется перевёрнутый вариант для наименования пакетов, поэтому сначала идёт ru , а потом уже название сайта. Пакет служит для уникальной идентификации вашего приложения, когда вы будете его распространять. Если сто человек напишет сто приложений с названием "Cat", то будет непонятно, где приложение, написанное разработчиком Василием Котовым. А приложение с именем пакета ru.vaskakotov.cat проще найти. Обратите внимание, что Гугл в своей документации использует пакет com.example в демонстрационных целях. Если вы будете просто копировать примеры из документации и в таком виде попытаетесь выложить в Google Play, то у вас ничего не выйдет - это название зарезервировано и запрещено к использованию в магазине приложений. Кнопка Edit позволяет отредактировать подготовленный вариант. Например, вы пишете приложение на заказ и вам нужно использовать имя пакета, утверждённое заказчиком, а не ваш вариант по умолчанию.
Ниже представлены два варианта для написания программ на C++ и Kotlin. Эти варианты мы пока не рассматриваем. Когда вы будете писать на Kotlin, то ставьте соответствующий флажок. Впрочем, вы можете сконвертировать проект с Java на Kotlin и позже средствами студии.
Нажимаем на кнопку Next и переходим к следующему окну. Здесь мы выбираем типы устройств, под которые будем разрабатывать своё приложение. В большинстве случае мы будет писать для смартфонов и планшетов, поэтому оставляем флажок у первого пункта. Также вы можете писать приложения для Android TV, Android Wear, Android Auto и Android Things.
Кроме выбора типа устройств, надо выбрать минимальную версию системы, под которую будет работать приложение. Выберите свой вариант. На данный момент Гугл поддерживает версии, начиная с API 7, выпуская специальные библиотеки совместимости для старых устройств. Но вы можете выбрать более современный вариант. У меня в наличии телефон с минимальной версией Android 4.4, поэтому я выставляю этот вариант.
java
Папка java содержит три подпапки - рабочую и для тестов. Рабочая папка имеет название вашего пакета и содержит файлы классов. Сейчас там один класс MainActivity . Папки для тестов можете не трогать. Если вы знаете, как работают пакеты в Java, то можете создавать новые папки и подпапки.
res
Папка res содержит файлы ресурсов, разбитых на отдельные подпапки.
- drawable - в этих папках хранят графические ресурсы - картинки и xml-файлы, описывающие цвет и фигуры.
- layout - в данной папке содержатся xml-файлы, описывающие внешний вид форм и различных элементов форм. После создания проекта там уже имеется файл activity_main.xml , который отвечает за внешний вид главного окна приложения.
- mipmap - здесь хранят значки приложения под разные разрешения экрана
- values - тут размещаются строковые ресурсы, ресурсы цветов, тем, стилей и измерений, которые мы можем использовать в нашем проекте. Здесь вы можете видеть файлы colors.xml , strings.xml , styles.xml . В старых проектах был ещё файл dimens.xml , сейчас от него отказались
Со временем вы будет свободно ориентироваться в этих папках, пока не забивайте себе голову.
Работа с проектом - Здравствуй, Мир!
Как уже говорилось, программа Hello, World! уже встроена в любой новый проект, поэтому вам даже не нужно ничего писать. Просто нужно запустить проект и получить готовую программу!
Для изучения вам нужно открыть два файла - MainActivity (скорее всего он уже открыт) и activity_main.xml (res/layout ) в центральной части Студии. Если файлы не открыты, то откройте их самостоятельно двойным щелчком для редактирования (или просмотра). Таким способом вы можете открыть любой нужный вам файл.
Не будем пока изучать код, а просто нажмём на зелёный треугольник Run (Shift+F10) на панели инструментов в верхней части студии для запуска приложения.
Если вы не настроили эмулятор, значит вы не читали предыдущий урок. Настройте сначала эмулятор и запускайте проект снова. Либо подключайте реальное устройство.
Если всё сделали правильно, то в эмуляторе или на устройстве загрузится ваша программа. Поздравляю!
Итак, если программа запустилась, то увидите окно приложения с надписью . Заголовок у программы будет также . Все эти строки можно найти в файле res/values/strings.xml и отредактировать при желании.
Теперь посмотрим на код. Сначала изучим activity_main.xml .
Смотреть его можно в двух режимах - Design и Text .
Откройте в режиме Text .
Это новый код шаблона, который появился в Android Studio 2.3 в марте 2017 года. Раньше использовался другой код с RelativeLayout (а ещё раньше и другой код с LinearLayout ). Если вам будут попадаться старые примеры, то в студии есть контекстное меню, которое поможет сконвертировать старый код в новый.
Немного о XML-коде. Имеется специальный контейнер ConstraintLayout , в котором размещён компонент TextView , предназначенный для вывода текста.
Теперь посмотрим на Java-код (MainActivity.java )
Package ru.alexanderklimov.helloworld; 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); } }
Перед вами открыт файл класса, где имя класса MainActivity совпадает с именем файла с расширением java (это правило, установленное языком Java). В первой строке идет название пакета - его мы задавали при создании проекта (Package Name ). Далее идут строки импорта необходимых классов для проекта. Для экономии места они свёрнуты в одну группу. Разверните её. Если однажды вы увидите, что имена классов выводятся серым цветом, значит они не используются в проекте (подсказка Unused import statement ) и можете спокойно удалить лишние строки. Также они могут удаляться автоматически (настраивается).
Далее идёт объявление самого класса, который наследуется (extends ) от абстрактного класса Activity . Это базовый класс для всех экранов приложения. Не исключено, что у вас будет AppCompatActivity , если при создании проекта вы оставили поддержку старых устройств (флажок Backwards Compatibilty (App Compat) ). В старых версиях не было плюшек, которые появились после Android 4, поэтому для них была создана специальная библиотека совместимости, которая позволяет использовать новинки от новых версий Android в старых программах. Класс AppCompatActivity как раз и относится к библиотеке совместимости. Считайте её бедным родственником базовой Activity . У неё есть все нужные методы и вспомогательные классы, но названия могут немного различаться. И смешивать названия нельзя. Если уж используете класс из библиотеки совместимости, то методы берите соответствующие.
На разных этапах использовались разные названия класса активности, которые могут вам встретиться в старых проектах. Например, сначала использовался FragmenActivity , затем ActionBarActivity , а 22 апреля 2015 года вышла новая версия библиотеки совместимости и на данный момент используется новый класс AppCompatActivity .
В самом классе мы видим метод onCreate() – он вызывается, когда приложение создаёт и отображает разметку активности. Метод помечен как protected и сопровождается аннотацией @Override (переопределён из базового класса). Аннотация может пригодиться вам. Если вы сделаете опечатку в имени метода, то компилятор сможет предупредить вас, сообщив об отсутствии такого метода у родительского класса Activity .
Разберём код метода.
Строка super.onCreate(savedInstanceState); – это конструктор родительского класса, выполняющий необходимые операции для работы активности. Эту строчку вам не придётся трогать, оставляйте без изменений.
Вторая строчка setContentView(R.layout.activity_main); представляет больший интерес. Метод setContentView(int) подключает содержимое из файла разметки. В качестве аргумента мы указываем имя файла без расширения из папки res/layout . По умолчанию проект создаёт в нём файл activity_main.xml . Вы можете переименовать файл или создать свой файл с именем cat.xml и подключить его к своей активности. Тогда код будет выглядеть так:
SetContentView(R.layout.cat);
Чтобы ваш код был аккуратным, старайтесь придерживаться стандартов. Если вы создаёте разметку для активности, то используйте префикс activity_ для имени файла. Например, разметка для второй активности может иметь имя activity_second.xml .