Как создать свое первое приложение для Android. Пошаговая инструкция для новичков

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 (экран). Поэтому сразу идем по пути appsrcmainreslayout и открываем файл 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.

Теперь запустим приложение на виртуальном смартфоне – RunRun 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 вы также можете найти здесь.

 

Версия для печатиВерсия для печати

Рубрики: 

  • 1
  • 2
  • 3
  • 4
  • 5
Всего голосов: 5
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Комментарии

Страницы

Аватар пользователя mike

...Каждый раз после загрузки [лога рантайма] приходится жать Alt+4.

Пару раз жмакнул Alt+F4...  

Аватар пользователя mike

За 2,5 года писания под андроид труднее всего мне давались UI c хорошим UX.

Любое более-менее сложное приложение имеет кучу контролов -- кнопок, чекбоксов и т.д.  Рекомендации Гугла постоянно меняются, размеры экранов тоже, и авторы постоянно изощряются, куда  и как втискивать контролы. Обычно, если все контролы не лезут на экран, то прибегают к кнопке "Ещё", которая либо включает контекстное меню, либо вызывает фрагмент,  содержащий продолжение контролов. Юзеру это понятнее, чем скроллирование линейки контролов, юзер просто может не догадаться потянуть за контролы, а если и потянет, то обязательно заденет ненужный.  ))

Резонно динамически как можно больше контролов  вмещать на главный экран, а оставшиеся отдавать кнопке "Ещё". Тут всё сводится к определению сколько контролов можно вместить на главный экран, зависящий от девайса.  Однако есть сложность: реальные физические параметры координат и размеров контролов становятся доступными по событию onGlobalLayout(), которое наступает позже события onCreate, но onCreate не может искать неразмещённые контролы! Можно, конечно их порождать программно, что геморр и "многакоду", однако существует нехитрый приём, резко упрощающий эту задачу.

(Ах, влом писать; впрочем, продолжение следует.)

 

Аватар пользователя mike
Шаг 1.  Пусть контекстное меню, вызываемое кнопкой "Ещё" имеет N пунктов. Отлаживаем исполнители кликов по пунктам этого меню. Задача: надо вертикально разместить максимум N кнопок от дна кнопки "Ещё" до дна используемого лейаута.  Есть ещё место.   Шаг 2. В классе активити объявляем  N членов типа Button и N и для каждого из них объявляем  N членов типа boolean, присвоив значения false. Смысл буля -- существование кнопки. Кроме того, объявляем целое roomSize = 0 (ск. кнопок влазит) и буль isRoom = false (влазит ли хоть что-нибудь).   Шаг 3. В обработчике события onCreateContextMenu, а вызывается оно при нажатии кнопки "Ещё", запрещаем создание пунктов, если соответствующие ему кнопки не существует.
  Шаг 4. Теперь надо разместить эти N кнопок. Мы заранее не знаем, сколько кнопок влезет, возможно, ни одной, однако полагаем, что все кнопки будут иметь одинаковый вертикальный размер, включая поля, равный высоте кнопки "Ещё". В дизайнере визуально определяемся с пустым местом, куда будем втискивать кнопки. Надо, чтобы в свободное место помещалась хотя бы одна кнопка. Начинаем размещать по одной. Ставим первую, привязав в xml её топ ко дну вышестоящей кнопки (а это кнопка "Ещё"), снабжаем её с помощью дизайнера всеми атрибутами -- ID, стиль, текст, внутреннюю иконку, поля, выранивание и т.д., прописываем в java реакцию на клик: public void on[имя]Click(View v){this::исполнитель}. Имя исполнителя копируем из контекстного меню. В дизайнер находим реакцию, вводим, далее с помощью дизайнера ставим видимость кнопки равной GONE, и -- о чудо! -- кнопка исчезает с экрана.   Шаг 5. Повторяем шаг 4 для остальных кнопок.   Шаг 6. В обработчике события onCreate узнаём т.н. плотность пикселов на единицу размера экрана: Display display = getWindowManager().getDefaultDisplay();         DisplayMetrics outMetrics = new DisplayMetrics();         display.getMetrics(outMetrics);

       float density = getResources().getDisplayMetrics().density;

Шаг 7. После того, как В обработчике события onCreate найдена кнопка "Ещё", ставим слушатель отрисовки её дна:      

protected ViewTreeObserverviewTreeObserver = elseBtn.getViewTreeObserver();         viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() и в нём прописываем обработчик события public void onGlobalLayout() {...}. По этому событию берём float'ами дно кнопки "Ещё" и дно лейаута, куда размещаем кнопки,  вычитаем из последнего первое. Получаем float. Берём высоту кнопки "Ещё": float elseBtnHeight = elseBtn.getHeight(); Делим свободное пространство на её высоту. Снова float. Округляем до целого, если дробная часть >0,75,  roomSize  = (int)(float val + 0.25). Вот столько кнопок влезет. isRoom = roomSize  > 0. Не забываем сразу же вырубить обозреватель:  elseBtn.getViewTreeObserver().removeOnGlobalLayoutListener(this), иначе тормоза.   Ещё не всё. Однако, надоело писать. И для кого я это пишу? Всё равно "Вести" никто не читает. Так, листают иногда. Журналистских рук дело. А пишу я для себя, чтобы не забыть, 8-ой десяток уже... Впрочем, продолжение следует.  
   
Аватар пользователя mike

Шаг 8. Добираемся, наконец, до функции (вообще-то, это метод, но я по привычке со времён чистого Си смешиваю понятия "функция" и "метод", хотя между ними  существует глубокое различие), которая определяет, будут ли исполнители коллбэков вызываться кнопками или из контекстного меню. Всего коллбэков N. Выглядит этот член класса активити примерно так:

   private void areButtons(){
        if (isRoom){
            for(int i = 0; i<roomSize; i++){
                if(i==0) {
                    vectBtn = findViewById(R.id.vectBtn);
                    isVectBtn = true;
                    continue;
                }
                if(i==1) {
                    metersBtn = findViewById(R.id.metersBtn);
                    isMetersBtn = true;
                    continue;
                }
                if(i==2) {
                    shitBtn = findViewById(R.id.shitBtn);
                    isShitBtn = true;
                    continue;
                }

               ........
               //
               
            }
        }
    }

roomSize <N. В этой функции  на каждую из roomSize  кнопок вычисляются ссылки (или, как принято говорить, кнопки "отыскиваются"), а их булевы признаки существования получают значения true. Ссылки на N - roomSize поведут в null, а признаки их существования останутся false. По умолчанию. В принципе,  в дальнейшем можно обходиться и без булевых признаков существования, проверяя лишь пустоту ссылок.

Кстати, В шаге 2 можно объявлять массивы кнопок и массивы признаков существования, но без массивов, имхо, нагляднее.

Функцию areButtons следует вызывать в конце обработчика события onGlobalLayout(). Вопрос лишь в том, когда можно пользоваться результатами её вызова.

(Продолжение следует)

Аватар пользователя mike

Шаг 9. Чтобы воспользоваться результатами работы функции areButtons, надо после события  onGlobalLayout()  для каждой кнопки выполнить нечто подобное

            if (isVectBtn)
                vectBtn.setVisibility(View.VISIBLE);
            else {
                if (vectBtn != null)
                    vectBtn.setVisibility(View.GONE);
            }

            if (isMetersBtn)
                metersBtn.setVisibility(View.VISIBLE);
            else {
                if (metersBtn != null)
                    metersBtn.setVisibility(View.GONE);
            }

...

А чтобы гарантированно выполнять это после события  onGlobalLayout(), учредите в главной  активности хендлер и запустите его после вызова функции areButtons(), как хендлер.post(elseMore), где elseMore -- имя функции, содержащей вышеприведенный блок.

Всё. Теперь контролы всех кнопок, которые не попали на экран, окажутся в контекстном меню кнопки "Ещё", а те, которые попали на экран,  исключатся из контекстного меню.

 

Аватар пользователя mike

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

Я нашёл для себя работающий способ: чистим проект Build->CleanProject, ребилдим проект Build->RebuildProject, поднимаем с диска сгенерированный на нём файл конфига File->ReloadAllFromDisk, и -- о чудо! -- исчезают ошибки ненайденности конфига. Почему студия не делает этого автоматически -- для меня загадка. Возможно, студию ещё будут дорабатывать. Или я чего-то ещё не знаю.  Может, кто-нибудь подскажет?

Аватар пользователя mike

Обнвружил, что при динамическом распределении контролов между контекстным меню и кнопками самый последний по очереди контрол то в меню, то на экране. Думаю, происходит это потому что размеры видимой части экрана немного изменяются в зависимости от его  температуры. Неспроста, значит, все размеры видюетов вычисляются системой  как float'ы, а не как int. 

Аватар пользователя mike

Обновил студию до Flamingo, сборщик до 8.0.0. Полёт пока нормальный. Но упорно не желает становиться SDK-платформа UpsideDownCake для Android 14 (API 34). Пишет, что не может удалить ранее недоустановленную  UpsideDownCake. Впрочем, смартфонов с Android 14 я не видел в продаже.

Понравилось, что теперь можно выбирать какой открыть проект через ПКМ по лончерной иконке студии.

Аватар пользователя mike

Уфф! установил UpsideDownCake, но пока ни одного эмулятора на этой платформе не создавал.

Аватар пользователя mike

Управление проектом -- необходимая вещь. Но надо комментировать изменения, которые закоммитил. Однако обязательно надо указывать, ДЛЯ ЧЕГО И ПОЧЕМУ их сделал. Иначе потом фиг вспомнишь ход своих мыслей. Такой вот опыт. Думаю, приходит со временем ко всем. Особенно с возрастом. :)

В С++ было просто. В аргументах функций указывал коллбэки -- функции, которые станут входными после вызова, и программа представляла собой шашлыки на мангале, в котором шампур выбирался нажатым контролом. В джаве  работаю с очередями задач. То же, но вид сбоку. :)

Страницы