Как писать программы в андроид студио
Разработка мобильного программного обеспечения может стать интересным и полезным занятием. В этой статье мы расскажем, как создать приложение для Android .
Android Studio - создание приложения
Чтобы написать приложение, нужно будет загрузить и установить Android Studio . В комплект поставки входит пакет разработки программного обеспечения со всеми библиотеками и кодами Android , необходимыми для разработки приложения. А также эмулятор Android , позволяющий сначала протестировать приложение на своем ПК, не устанавливая его на реальном мобильном устройстве.
Но сначала нужно загрузить и установить Java Development Kit ( JDK ) от Oracle . Найдите раздел « Java SE Development Kit 7u79 » и загрузите версию для своего ПК. Важно загрузить правильную версию ( 32-разрядную или 64-разрядную ), иначе Android Studio не сможет найти Java Runtime Environment ( JRE ).
Примечание: Oracle не будет публиковать на своих общедоступных сайтах какие-либо обновления Java SE 7 , и предполагается, что пользователи массово перейдут на Java 8 . Но в настоящий момент Android Studio требует наличия Java 7 . Это может измениться в будущем.
После того, как вы установили JDK , нужно инсталлировать Android Studio . Во время установки необходимо указать, сколько памяти зарезервировать для эмулятора Android . Он запускает Android в виде виртуальной машины, как смартфон с процессором Intel . Это быстрее, чем эмуляция процессора ARM на ПК. Но для запуска этой виртуальной машины эмулятор должен выделить некоторый объем памяти. Но перед тем как создать приложение для Андроид самому, имейте в виду, что сочетание Android Studio , Java и эмулятора будет довольно ресурсоемким, и компьютер может подтормаживать.
Google говорит, что необходимо как минимум 2 ГБ оперативной памяти, а рекомендуется 4 ГБ. Но мой основной ПК имеет 8 ГБ, и все равно иногда тормозит:
При первом запуске Android Studio выполнит первичную инициализацию, включающую в себя загрузку и установку актуальной версии Android SDK . Это может занять несколько минут.
Когда все будет загружено и установлено, вы увидите меню, которое позволит создать новый, открыть существующий или импортировать проект и т. д.
Разработка приложений для Android - cоздаем новый проект
Нажмите « Start a new Android Studio project » и введите название своего приложения в поле « Application name ». В поле « Company Domain » введите официальный домен вашей компании. Если вы независимый разработчик или любитель, введите собственный домен. Если вы просто экспериментируете с Android и не собираетесь в ближайшее время публиковать свои приложения в Google Play , просто оставьте пример домена, только измените « user » на ваше имя ( без пробелов ):
В следующем диалоговом окне проверьте, чтобы у вас выбрана опция « Phone and Tablet », а для « Minimum SDK » установлено - API 15: Android 4.0.3. Для опций « Wear » и « TV » флажки не должны быть установлены.
В диалоговом окне « Add an activity to Mobile » оставьте значение по умолчанию « Blank Activity » и нажмите « Next ». В диалоговом окне « Customize the Activity » оставьте все значения и нажмите « Finish »:
Перед тем, как создать приложение для Андроид с нуля, уже можно скомпилировать и запустить автоматически созданное приложение, но это не очень интересно. Вместо этого мы добавим несколько мелочей, чтобы вы познакомились с разработкой Android-приложений .
Как сделать приложение для андроид - дерево проекта
Дерево проекта содержит все файлы и ресурсы, необходимые для создания Android-приложения . Если вы знакомы с написанием простых программ на Java , C , Python и т. д., то могли бы подумать, что все будет содержаться только в одном или двух файлах. Но разработка Android-приложений немного сложнее:
В узле « app » дерева проектов содержится несколько узлов ( например, папки ), которые можно развернуть. Узлами верхнего уровня являются “ manifests ”, “ java ” и “ res ”. Последний - это сокращение от “ resources ”.
В “ manifests ” располагается файл « AndroidManifest.xml », каждое приложение должно содержать его. Это XML-файл с информацией о приложении, включая его название. Часто добавляемым в этот файл элементом является список разрешений, необходимых для приложения. Для этого простого приложения не нужно здесь ничего менять.
Продолжаем создавать простое приложение для Андроид . В разделе « res » есть несколько папок для графики, меню и элементов пользовательского интерфейса. Нас интересуют « layout » и « values ». В папке « layout » находится файл под названием « activity_main.xml ». Это XML-файл , описывающий пользовательский интерфейс. Редактировать его можно двумя способами. Первый - непосредственное редактирование XML-кода , второй - использование встроенного дизайнера пользовательского интерфейса:
В папке « values » содержатся несколько XML-файлов . В данный момент наиболее важным для нас является strings.xml . Вместо того чтобы задавать в Java-коде строковые значения их принято помещать в файл « strings.xml », и мы можем ссылаться на них через идентификаторы. Преимущество заключается в том, что если строка используется несколько раз, ее можно изменить только один раз, и изменения вступят в силу во всех местах. Это также упрощает поддержку нескольких языков в приложении.
Чтобы создать приложение для Андроид самому, нужно будет изменить файлы MainActivity.java , activity_main.xml и strings.xml .
Как сделать свое приложение для Android - написание приложения
Для нашего примера мы добавим кнопку с меткой « Tap Me! », изменим приветствие по умолчанию « Hello world! » на « Tap me if you dare! ». А также поменяем его, чтобы оно находилась в центре. И добавим код, чтобы при нажатии кнопки отображался текст « toast »!
Начнем с изменения текста приветствия и его выравнивания. Сначала найдите в дереве проекта файл « activity_main.xml » и дважды кликните по нему. Помните, что « activity_main.xml » - это файл, который содержит определение пользовательского интерфейса. В нижней части окна кода есть две вкладки: « Design » и « Text ». Перейдите на вкладку « Design ».
Теперь нажмите на текст « Hello world! », который показан в окне предварительного просмотра экрана смартфона. Если он слишком мал, используйте кнопку масштабирования ( лупа со значком «плюс» ).
В окне свойств, расположенном справа от изображения телефона, прокрутите экран вниз до тех пор, пока не найдете надпись « layout: centerInParent ». Кликните по пробелу рядом с ней и выберите « horizontal ». После этого текст « Hello world! » переместится в центр:
Перед тем, как создать приложение для Android без навыков, изменим текст. Строка « Hello world! » хранится в файле « strings.xml » в разделе res-> values . Если вы дважды кликните по этому файлу, то увидите несколько строк XML , которые определяют строки, используемые приложением.
Найдите эту строку:
И измените ее на:
Мы изменили выравнивание приветствия и его текст. Теперь добавим кнопку. Вернитесь на вкладку « Design » файла « activity_main.xml », найдите в списке « Palette » слева от изображения смартфона пункт « Button » и нажмите на него. Теперь кликните где-нибудь под надписью « Tap me if you dare! ».
Дважды кликните по кнопке, чтобы изменить ее текст. В конце поля “ text: ” расположена кнопка с тремя точками, нажмите на нее. В окне « Resources » нажмите « New Resource », а затем « New String Value… ». В поле « Resource name: » введите « tapme », а в поле « Resource value: » - “ Tap me! ”. Затем нажмите « ОК ». Теперь у нас есть кнопка “ Tap me! ”.
Вернитесь в раздел конструктора файла « activity_main.xml », нажмите кнопку и прокрутите список свойств до пункта « onClick ». Нажмите на поле справа, и на экране появится список функций. Кликните по « onButtonTap », это функция, которую мы только что добавили.
Вот и все, что касается создания приложения для Андроид самому, теперь протестируем его в эмуляторе.
Создание приложения для андроид - построение и тестирование
В меню « Tools » перейдите к Android- AVD Manager . Этот инструмент отображает список текущих настроенных виртуальных Android-устройств . У вас будет одно устройство, настроенное по умолчанию, возможно, Nexus 5 . Нажмите на значок воспроизведения ( треугольник ) в столбце « actions ». Это запустит эмулятор.
В зависимости от производительности вашего ПК и объема выделенной памяти запуск эмулятора может занять несколько минут. После того, как эмулятор будет запущен, перейдите в меню « Tools » и нажмите « Run ‘app ». Приложение будет скомпилировано и отправлено в эмулятор. Во время этого Android Studio спросит вас, какой эмулятор использовать. Вы увидите в списке свой текущий эмулятор. Это должна быть опция по умолчанию, поэтому просто нажмите « OK »:
Что делать дальше и заключение
Также можно запустить приложение на реальном устройстве. Самый простой способ сделать это - включить USB-отладку на Android -устройстве и подключить его к компьютеру. Опцию отладки по USB можно найти в разделе Настройки – Для разработчиков . Если у вас нет этого раздела, откройте « Настройки » - « О телефоне », а затем нажмите « Номер сборки » семь раз.
Когда устройство будет подключено, нажмите « Run ‘app » в меню « Tools », но на этот раз не отправляйте приложение на виртуальное устройство, а отправьте на реальное устройство. Если устройство отсутствует в списке, это означает, что вы не включили отладку по USB или необходимо установить соответствующий USB-драйвер . Смотрите разделы USB-драйверы OEM и USB-драйвера Google в документации Google.
Вы успешно создали простое приложение для Андроид . Следующее, что нужно сделать, это написать второе приложение и продолжить работу. Google предоставляет много учебных материалов для Android-разработчиков , а также обширную документацию и множество примеров кода .
Но прежде всего вам стоит продолжать учиться!
Пожалуйста, оставляйте ваши комментарии по текущей теме статьи. Мы крайне благодарны вам за ваши комментарии, отклики, лайки, дизлайки, подписки!
Этот урок научит вас основам того как написать приложение для Android используя среду разработки Android Studio. Устройства Андроид становятся всё более распространенными, спрос на новые приложение все время только увеличивается. Android Studio бесплатная, простая в использовании среда разработки.
Для этого урока лучше всего, если у вас есть хотя бы поверхностные знания языка Java так как это язык используемый Android. В уроке не будет слишком много кода так как я исхожу из того что вы немного знакомы с Java или готовы найти то что вы еще не знаете. Создание приложения займет 30-60 минут, зависит от того как быстро вы скачаете и установите все необходимые программы. После знакомства с этим уроком по созданию своего первого приложения для Андроид, возможно вы найдете себе новое веселое хобби или даже начнете карьеру многообещающего разработчика мобильных приложений.
Этап 1: Устанавливаем Android Studio
Этап 2: Создаем новый проект
- Откройте Android Studio.
- В меню «Quick Start», выберите «Start a new Android Studio project».
- В окне «Create New Project» (окно которое открылось), назовите ваш проект «HelloWorld».
- Название компании по желанию.*
- Нажмите «Next».
- Убедитесь, что галочка стоит только на «Phone and Tablet».
- Если вы планируете тестировать своё первое приложение на вашем телефоне, то убедитесь, что выбрана правильная версия Андроид (не старше той, что на телефоне).
- Нажмите «Next».
- Выберите «Blank Activity».
- Нажмите «Next».
- Оставьте все остальные поля как они есть.
- Нажмите «Finish».
Этап 3: Редактируем приветствие
- Перейдите на вкладку activity_main.xml, скорее всего она уже активна.
- Убедитесь, что внизу экрана активна вкладка Design (скорее всего это так).
- Перетащите мышкой фразу «Hello, World!» из левого верхнего угла телефона в центр экрана.
- В левой части экрана находится дерево папок. Откройте папку под названием «values».
- В этой папке дважды щелкните на файл «strings.xml».
- В этом файле найдите строчку содержащую текст «Hello world!» и добавьте к этому тексту «Welcometomyapp!».
- Вернитесь на вкладку «activity_main.xml».
- Убедитесь, что ваш текст находится по центру экрана телефона и содержит текст «Helloworld! Welcometomyapp!».
Этап 4: Добавляем Кнопку
- На вкладке «activity_main.xml» выберите внизу вкладку «Design».
- В колонке слева от окна, где находится телефон, найдите папку под названием «Widgets». Там находятся различные кнопки.
- Возьмите кнопку «Button» и перетащите её на экран телефона. Она должна находиться по центру экрана прямо под вашим текстом.
- Убедитесь, что кнопка все еще выбрана (синяя рамка вокруг неё).
- В нижнем правом углу есть окошко со свойствами выбранного объекта. Промотайте вниз и найдите строчку под названием «text».
- Поменяйте текст «New Button» на «Next Page».
Этап 5: Создаём Second Activity
- В верхней части дерева файловой системы проекта, щелкните правой кнопкой мыши на папке под названием «app».
- Выберите New > Activity > Blank Activity.
- В появившемся окне в верхней строчке введите «SecondActivity».
- Нажмите «Finish».
- Перейдите на вкладку «activity_second.xml» и убедитесь, что внизу выбрана вкладка «Design».
- Переместите текст из верхнего левого угла телефона в центр экрана, как мы делали на предыдущих шагах.
- Убедитесь, что текстовый блок все еще выбран (синяя рамка) и в нижнем правом углу свойств объекта найдите строчку «id» и введите туда «text2».
- В верхнем левом углу (в дереве проекта) снова выберете двойным нажатием «strings.xml».
- Под строчкой
добавьте следующую строку
Этап 6: Прописываем действие для кнопки
- В верхней части выберите вкладку «MainActivity.java».
- Добавьте следующие строчки в конце onCreate метода:
Этап 7: Тестируем приложение
- На панели инструментов в верхней части окна Android Studio нажмите на зеленый символ воспроизведения.
- В окне «ChooseDevice» выберите пункт «Launchemulator» и выберете устройство.
- Нажмите на кнопку «OK».
- Когда эмулятор запустится (это может занять длительное время) приложение автоматически откроется на виртуальном устройстве.
- Убедитесь что весь текст отображается правильно и нажатие на кнопку приводит вас к следующей странице.
Как получить файл .apk в Android Studio
На мой взгляд, этот вопрос хорошо освещен в этой статье, так что не буду повторяться. Наиболее простым для первого урока мне показался Ручной способ.
Когда вы получите файл, то можете скопировать его на свой телефон и установить приложение.
Этап 8: Результат
Поздравляю! Вы только что завершили написание своего первого Android-приложения с некоторыми основными функциональными возможностями. Готовое приложение должно иметь страницу приветствия пользователя и кнопку, которая приведет пользователя на вторую страницу.
Вы бегло познакомились с разработкой приложений для андроид и возможно пробудили в себе желание изучить все, что необходимо, чтобы в дальнейшем развиваться по этому направлению.
В любом деле самое сложное — это начало. Часто бывает тяжело войти в контекст, с чем столкнулся и я, решив разработать свое первое Android-приложение. Настоящая статья для тех, кто хочет начать, но не знает с чего.
Статья затронет весь цикл разработки приложения. Вместе мы напишем простенькую игру “Крестики-Нолики” с одним экраном (в ОС Android это называется Activity).
Отсутствие опыта разработки на языке Java не должно стать препятствием в освоении Android. Так, в примерах не будут использоваться специфичные для Java конструкции (или они будет минимизированы на столько, на сколько это возможно). Если Вы пишете, например, на PHP и знакомы с основополагающими принципами в разработке ПО, эта статья будет вам наиболее полезна. В свою очередь так как, я не являюсь экспертом по разработке на Java, можно предположить, что исходный код не претендует на лейбл “лучшие практики разработки на Java”.
Установка необходимых программ и утилит
-
; ;
- 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 строчками:
Метод setContentView (равносильно this.setContentView) устанавливает xml-макет для текущего экрана. Далее xml-макеты будем называть «layout», а экраны — «Activity». Layout в приложении будет следующий:
Для этого приложения идеально подойдет TableLayout. Id можно присвоить любому ресурсу. В данном случае, TableLayout присвоен При помощи метода findViewById() можно получить доступ к виду:
Теперь необходимо реализовать метод buildGameField(). Для этого требуется сгенерировать поле в виде матрицы. Этим будет заниматься класс Game. Сначала нужно создать класс Square для ячеек и класс Player, объекты которого будут заполнять эти ячейки.
Square.java
Player.java
Все классы нашего приложения находятся в папке src.
Game.java
Инициализация Game в конструкторе KrestikinolikiActivity.
Метод buildGameField() класса KrestikinolikiActivity. Он динамически добавляет строки и колонки в таблицу (игровое поле):
В строке 8 создается объект, реализующий интерфейс View.OnClickListener. Создадим вложенный класс Listener. Он будет виден только из KrestikinolikiActivity.
Осталось реализовать логику игры.
Определение победителя
К. О. подсказывает, что в крестики-нолики выирывает тот, кто выстроет X или O в линию длиной, равной длине поля по-вертикали, или по-горизонтали, или по-диагонали. Первая мысль, которая приходит в голову — это написать методы для каждого случая. Думаю, в этом случае хорошо подойдет паттерн Chain of Responsobility. Определим интерфейс
Так как Game наделен обязанностью выявлять победителя, он реализует этот интерфейс. Настало время создать виртуальных «лайнсменов», каждый из которых будет проверять свою сторону. Все они реализует интерфейс WinnerCheckerInterface.
WinnerCheckerHorizontal.java
WinnerCheckerVertical.java
WinnerCheckerDiagonalLeft.java
WinnerCheckerDiagonalRight.java
Проинициализируем их в конструкторе Game:
Победителя проверяем после каждого хода. Добавим кода в метод onClick() класса Listener
Метод gameOver() реализован в 2-х вариантах:
Для Java, gameOver(Player player) и gameOver() — разные методы. Воспользовавшись Builder'ом Toast.makeText, можно быстро создать и показать уведомление. refresh() обновляет состояние поля:
Готово! Надеюсь, эта статья помогла Вам освоиться в мире разработки под OS Android. Благодарю за внимание!
Добрый день, господа! Я ученик 11 класса и разработкой занимаюсь только от того, что не хочу готовиться к ЕГЭ. Идею приложения можно описать тремя словами — увидел, запомнил, повторил. Перед игроком появляется квадратное поле с определённым число закрашенных элементов. Через некоторое время поле очищается. Надо выбрать какие элементы были закрашены. По мере прохождения уровней игры поле становится всё больше и запоминать приходится больше.
Теория
Для начала нам нужно определиться с архитектурой программного интерфейса. Я предпочитаю MVC (Model — View — Controller).
При таком подходе контроллер перехватывает событие извне и в соответствии с заложенной в него логикой, реагирует на это событие изменяя модель, посредством вызова соответствующего метода. После изменения модель использует событие о том что она изменилась, и все подписанные на это события представления, получив его, обращаются к Модели за обновленными данными, после чего их и отображают. Так, определились. Дальше нужно выбрать язык программирования. Мне нравиться Java. Java — это объектно ориентированный язык программирования, поэтому нам следует придерживаться принципов ООП:
1) Инкапсуляция — это компонент позволяющий объединить код и данный которыми он манипулирует.
2) Полиморфизм — свойство системы, позволяющее использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
3) Наследование — свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым или родительским классом. Новый класс — потомком, наследником, дочерним или производным классом.
Теперь ограничим предметную область такими классами как:
Игра (Game), Игрок (Player), Поле (Field). Игра отвечает за данные формируемые непосредственно в игре. Поле хранит информацию о том, какие ячейки закрашены, а какие нет. Игра умеет создавать поле. Игрок умеет обрабатывать пользовательские данные, т.е. сохранять очки и рейтинг, когда это необходимо.
Основная часть
Хватит теории. Нам нужно выполнить следующую последовательность действий:
Создадим пустой проект и начнём творить. Определим структура пакетов таким образом:
Дальше мы проделываем небольшой трюк. Создаём файлы разметки:
Xml файл root отвечает за корень нашего представления. Внутри него будут динамически меняться разметки фрагментов, которые мы уже создали. Соответственно в пакете представления (view) создадим классы фрагменты:
Каждый фрагмент отвечает за один режим игры. При открытии приложения выполняется метод onCreate класса MainActivity(который мы тоже положили в пакет view). Изменим это метод до такого состояния:
Тут мы проверяем, что если наша активность создаётся первый раз, то нужно создать объекты фрагментов и сделать видимым фрагмент меню. Конечно прежде чем создавать объекты нужно задать им ссылки, но я думаю, что с этим вы сами справитесь.
Фрагменты созданы, но они ничего не делают. Самое время придать вдунуть в них жизнь. Создадим интерфейс:
Через методы данного интерфейса объекты будут сообщать о своих действиях активности, а она уже будет решать, что ей делать.
Создадим фрагмент главного меню:
Данный класс определяет базовую функциональность режимов игры. Он умеет создавать поле, устанавливать текущий уровень игры, создавать диалоговые окна (именно для этого ему и нужна ссылка на активность) и показывать их. Объекты данного класса мы создавать не можем, поэтому создадим классы наследники. К примеру класс GameModSprint:
Этот класс определяет каким образом будут появляться диалоговые окна. Дело в том, что не всегда мне нужно просто перенести игрока на следующий уровень. К примеру в других режимах игры я захочу сделать прибавление рейтинга игроку или ещё какие-либо манипуляции с пользовательскими данными которые нужно выполнять только в данном режиме игры. Остальные классы создаются аналогичным образом.
И наконец мы можем реализовать наш интерфейс.
" alt=«image»/>
Теперь у фрагмента игрового уровня есть всё необходимое для создания. Он знает о текущем поле всё, что ему нужно. Осталось только связать наши данные с пользовательским интерфейсом.
Обратите внимание, на этот метод:
С помощью него активность передаёт ссылку на объект игры фрагменту. Также, чтобы не использовать длинных точечных нотация создадим отдельную ссылку для поля.
Код в целом очень простой. Создаются массив кнопок, заполняется. Получается, что индексы двумерного массива кнопок совпадают с индексами двумерного массива из объекта класса Field.
Таким образом при определении нажатой кнопки нужно проверить какая цифра лежит в массиве объекта класса Fild. Если 0, то пользователь сделал неверный ввод и надо закончить игру вызовом
который создаст и откроет нужное нам диалоговое окно с выборов действий.
Если игрок выбрал все элементы равное 1, то создаётся победное диалоговое окно. Несмотря на то, что у нас ссылка типа Game объект создавался активностью типа GameModSprint, значит и вызовется соответствующая переопределённая версия этого метода:
Таким образом мы пользуемся мощнейшим средством языка Java — динамической диспетчеризацией методов.
Внимание! В статье описывается создание приложения версии 1.0. Текущий код в репозитории может отличаться от описываемого в статье.
Наверное, некоторые из вас знают, что помимо языка программирования Kotlin JetBrains также разрабатывает библиотеку Anko, для создания UI приложения, в качестве замены обычным XML-файлам. Мы не будем использовать его в нашем проекте, дабы не ставить в затруднительное положение людей не знакомых с Anko.
Для написания приложений на языке Kotlin, Android Studio нужен специальный плагин. Инструкцию по установке плагина можно найти здесь. Также не забудьте отключить функцию «Instant Run» в настройках Android Studio, т. к. на данный момент она не поддерживается плагином Kotlin.
Для корректной работы генерации кода нужно использовать версию плагина не ниже 1.0.1. Я использовал версию Kotlin 1.0.2 EAP. Вот так выглядит файл build.gradle приложения в моем проекте:
Итак, для начала нам нужно определиться что же мы будем писать? Недолго думая я остановился на приложении-заметках. Название тоже придумалось легко — Notelin. Приложение очень простое и состоит из двух экранов:
— Главный экран — содержит в себе список с заметками
— Экран заметки — здесь можно смотреть/редактировать содержание выбранной заметки
Требования к приложению небольшие:
— Добавление/просмотр/удаление заметки
— Просмотр информации о заметке
— Сортировка заметок по заголовку и по дате
— Поиск по заголовкам заметок
Для работы с базой данных я буду использовать библиотеку Android Active. Урок по работе с ней можно найти по этой ссылке. Для реализации Depency Injection была использована библиотека Dagger 2. На Хабре есть много статей по работе с ней. Основой всего приложения будет библиотека Moxy. С ее помощью мы реализуем паттерн MVP в нашем проекте. Она полностью решает проблемы жизненного цикла, благодаря чему вы можете не переживать о пересоздании компонентов вашего приложения. Также мы воспользуемся набором расширений для языка Kotlin в Android — KAndroid. Про остальные библиотеки я буду рассказывать по ходу дела.
Ниже приведен список зависимостей проекта:
А вот так выглядит список зависимостей приложения:
Обратите внимание, что вместо apt я использую kapt. Это плагин для Gradle, позволяющий аннотировать Kotlin-элементы.
Вот так выглядит структура нашего проекта в конечном варианте:
У заметок будет четыре поля:
- Дата создания
- Дата изменения
- Заголовок
- Текст
Реализуем все это в коде:
По этой модели библиотекой ActiveAndroid будет создана БД, в которой будут храниться наши заметки. Если вы заметили, у нас есть два конструктора: пустой и с параметрами. Первый конструктор будем использовать мы, а второй — ActiveAndroid. Наша модель наследуется от класса Model, благодаря чему мы можем сохранять и удалять наши заметки просто вызывая методы save() и delete(), например:
Но прежде чем использовать нашу модель, нам нужно прописать кое-какие мета-данные в Manifest-файле:
Думаю, все понятно без комментариев. Осталось унаследовать класс Application от com.activeandroid.app.Application:
Чтобы приложение было менее зависимо от БД я создал обертку NoteDao над нашей моделью, в которой будут происходить все операции по созданию, сохранению, обновлению и удалению заметок:
Наверное, вы заметили, что для создания объектов мы не использовали ключевое слово new — это отличие Kotlin от Java.
Также является главным экраном приложения. На нем пользователь может добавить/удалить заметку, просмотреть информацию о заметке, отсортировать их по дате или названию, а также произвести поиск по заголовкам.
Создаем MainView и MainPresenter
Теперь нам нужно перевести все это в код. Для начала создадим интерфейс нашей View:
Далее мы реализуем созданный интерфейс в нашей активити:
Одной из особенностей Kotlin, является то, что наследование и реализация интерфейсов указывается через двоеточие после имени класса. Также не имеет разницы идет название родительского класса перед интерфейсами, после или даже между ними, главное, чтобы класс в списке был один. Т. е. запись выше могла бы выглядеть так:
Если же вы попытаетесь добавить через запятую название еще одного класса, то IDE выдаст ошибку и подчеркнет красной линией название класса, который идет вторым.
Пока оставим методы пустыми. Как видите, активити наследуется от MvpAppCompatActivity. Это нужно для того, чтобы активити могла восстанавливать состояние при повороте экрана.
Создадим класс презентер:
Презентер также наследуется от MvpPresenter, которому мы указываем с какой View мы будем работать.Осталось инжектировать нашу модель в презентер. Для этого мы создаем модуль — поставщика NoteDao:
Создадим Component для инжектирования презентера:
Теперь нам нужно создать статический экземпляр класса AppComponent в классе Application:
Теперь мы можем инжектировать нашу модель в презентере:
Для взаимодействия MainView и MainPresenter нам нужно создать переменную в MainActivity:
Плагин Moxy сам привяжет View к фрагменту и произведет другие необходимые действия.
Создадим разметку экрана со списком и плавающей кнопкой. Файл activity_main.xml:
Для реализации летающей кнопки я использовал библиотеку FloatingActionButton. Google уже добавили FAB в support-библиотеку, поэтому вы можете воспользоваться их решением.
Укажем нашей Activity, какой макет она должна показывать:
Далее нам нужно связать FAB и список, чтобы при прокручивании списка вверх кнопка исчезала:
Нам не нужно писать порядком надоевший findViewById, нужно лишь прописать одну строчку в блоке с import'ами:
Как видите, последний пакет совпадает с названием нашего xml-файла. IDE автоматически инициализирует свойства (property) наших View и их имена совпадают с ID, которые мы указали в разметке.
Давайте реализуем загрузку заметок из БД. Заметки нужно загружать только один раз и использовать их в последующем. В этом нам поможет метод onFirstViewAttach класса MvpPresenter, который вызывается единожды при первой привязке View к презентеру. Далее, сколько бы мы не крутили и вертели нашу Activity, данные будут закешированы в презентере.
Создадим адаптер для нашего списка:
В адаптере мы используем метод formatDate. Он служит для форматирования даты в строку:
Данный метод находится в файле DateUtils.kt и мы можем использовать как обычный статический метод. Отличие от статического метода здесь в том, что метод принадлежит не классу, а пакету и нам не нужно писать имя класса перед названием метода. В аннотации мы указываем название класса, через который мы будем обращаться к методу из Java. Например в Java дынный метод будет вызываться так:
В методе onNotesLoaded нашей Activity мы показываем наши заметки:
Насколько я знаю, для обработки клика по элементам RecycleView не существует «официального» OnItemClickListener. Поэтому мы воспользуемся своим решением:
В методе onCreate нашей Activity пишем:
Функция with позволяет не писать каждый раз имя переменной, а только лишь вызывать методы у объекта, который мы передали в нее. Обратите внимание, что для получения Activity я использовал не просто this, а this@MainActivity. Это связано с тем, что при использовании this в блоке with, возвращается объект, который мы передали в функцию with. При обычном клике по пункту мы переходим на Activity, где мы можем просмотреть текст нашей заметки. При долгом нажатии появляется контекстное меню. Если вы заметили, перед закрывающей скобкой я не написал слово return. Это не ошибка, а особенность языка Kotlin.
Вот что происходит при нажатии на пункт меню в презентере:
Мы еще не создали класс NoteActivity, поэтому компилятор будет выдавать ошибку. Для решения этой проблемы можно создать класс NoteActivity или вовсе закомментировать код внутри метода openNote. Запись NoteActivity::class.java аналогична NoteActivity.class в Java. Также заметьте, что мы обращаемся к списку не через метод get(position), а через квадратные скобки, как к обычному массиву.
При использовании MVP-библиотеки Moxy в своем приложении, нам нужно привыкать, что все действия с View, такие как показ/закрытие диалога и другие, должны проходить через презентер. Изначально это не очень привычно и неудобно, но пользы от этого гораздо больше, т. к. мы можем быть уверены, что при пересоздании Activity наше диалоговое окно никуда не пропадет.
Я не буду показывать код контекстного меню, удаления и показа информации о заметке т. к. статья получается очень большой. Но, думаю, общий смысл вы уловили. Также следует отметить, что метод hideNoteContextDialog у презентера должен вызываться даже при закрытии диалога через кнопку назад или при нажатии на область за границами диалога.
При нажатии на FAB должна создаваться новая заметка:
Для создания новой заметки мы вызываем у презентера функция openNewNote:
Метод openNewNote использует созданный нами ранее openNote, в который мы передаем Context и позицию заметки в списке.
Реализуем поиск по заметкам
Давайте добавим поиск по заметкам. Создайте в папке res/menu файл main.xml:
В MainActivity пишем:
При изменении текста в поле поиска мы передаем строку из поля в презентер, после чего показываем результаты в списке. На самом деле, у SearchView нет метода onQueryChange, его добавила библиотека KAndroid.
Реализуем поиск в презентере:
Обратите внимание, как красиво, в одну строчку мы реализовали поиск по списку с помощью метода filter и лямбд. В Java тот же функционал занял бы 6-7строк. Осталось отобразить результаты поиска:
Реализуем сортировку заметок
И последний этап в создании главного экрана, это сортировка заметок. Добавим в res/menu/main.xml следующие строки:
Теперь нам нужно обработать нажатие на пункты меню:
Оператор when является более функциональным аналогом switch-case в Java. Код сортировки в MainPresenter:
Теперь нам нужно создать экран с содержанием заметки. Здесь пользователь может просмотреть/отредактировать заголовок и текст заметки, сохранить или удалить ее, а также просмотреть информацию о заметке.
Создаем NoteView и NotePresenter
Экран содержит всего лишь три View:
-Заголовок
-Дата последнего изменения
-Текст заметки
А вот и сама разметка:
В начале статьи я мельком упомянул об Anko. Библиотека позволяет существенно сократить код, не теряя при этом в удобочитаемости. Вот так, например, выглядела бы наша разметка при использовании Anko:
Но не будем отвлекаться и приступим к написанию кода. Первым делом нам нужно создать View:
Имплементируем NoteView в NoteActivity:
В onCreate мы извлекаем id заметки, чтобы презентер достал заметку из БД и передал данные во View. Создадим презентер:
Не забудьте добавить в класс AppComponent строку:
Покажем нашу заметку:
Реализуем сохранение заметки
Для сохранения заметки нам нужно выбрать соответствующий пункт в меню. Создайте файл res/menu/note.xml:
Опять же, я не стал приводить код удаления и вывода информации о заметке. При просмотре исходного кода, вы можете заметить, что помимо идентификатора заметки я передал в NoteActivity позицию заметки в списке. Это нужно для того, чтобы при удалении заметки на экране просмотра заметки, она также удалялась из списка. Для реализации этого функционала я использовал EventBus. И опять, я не стал приводить код.
На этом все: заметки добавляются, редактируются и удаляются. Также мы можем осуществить поиск и сортировку заметок. Обязательно посмотрите полный исходный код, ссылку на который я привел в конце статьи, чтобы лучше понять как все устроено.
Конечно же, нельзя забывать о людях, которые помогли мне при написании статьи. Хотел бы выразить благодарность хабраюзерам Юрию Шмакову (@senneco) за помощь с его библиотекой Moxy и за помощь по другим вопросам. Также, хочу сказать спаcибо сотруднику JetBrains Роману Белову (@belovrv) за ревью статьи и за предоставленный код на Anko.
UPD: Еще хотел сказать спасибо Sirikid за EPIC COMMIT, благодаря которому я переделал внушительную часть кода с использованием фич Kotlin'а.
Надеюсь, эта статья смогла убедить вас в том, что писать приложения на Kotlin не трудно, а может даже и легче, чем на Java. Конечно же, могут встречаться и баги, которые сотрудники JetBrains достаточно быстро фиксят. Если у вас появились какие-либо вопросы, вы можете задать их напрямую разработчикам на Slack-канале. Также вы можете почитать статьи о разработке на Kotlin здесь.
Читайте также: