Мне всегда нравилось программировать, и я давно хотел создать приложение.

Имея некоторый опыт работы с Java, но не имея опыта работы с Android, я решил записаться на курс Android на Udemy. Полный курс для разработчиков Android: от новичка до продвинутого - это самый популярный курс для Android, набравший на сегодняшний день более 90000 учащихся (у занявшего второе место чуть более 68000).

Отзывы других студентов часто полезны при принятии решения о зачислении на курс, но во многих случаях они являются расплывчатыми, общими и не совсем отражают то, что предлагает курс. Вместо того, чтобы просто написать обзор из пары предложений, я подумал, что буду записывать свой ежедневный опыт работы с курсом, включая примеры того, какой контент будет предлагать курс. За исключением раздела в игровой библиотеке gdx для Android, который я пропустил (использую Unity), освещена каждая часть курса. Таким образом вы сможете увидеть, что вы узнаете, и принять более обоснованное решение о регистрации.

tl; dr В целом я бы поставил курс на 7 из 10. Вы можете легко пройти через это, потратив всего пару часов в день, и это хорошее введение в программирование для Android, но очень легкое в теории, иногда слишком легкое. Инструктор покажет вам, как реализовать многие ключевые функции приложений для Android, хотя часто вам остается только гадать, что именно делают конкретные строки кода и как все сочетается друг с другом. Я также хотел бы, чтобы больше времени было потрачено на определенные части, такие как фрагменты, службы и связанные службы, которые получили краткие разделы, но не были изучены подробно. Наконец, многие из реализованных приложений не очень интересны, и было бы интереснее попытаться воссоздать актуальные в настоящее время приложения, такие как Uber или Reddit. Если бы мне представилась такая возможность, я бы, вероятно, снова выбрал курс, хотя есть еще много возможностей для улучшения. Продолжайте читать, чтобы узнать подробности.

1 января 2018 г .:

Сегодня я загрузил Android Studio и поигрался с некоторыми макетами. Из того, что я могу сказать, некоторые из основных типов макетов - это RelativeLayout, LinearLayout, ConstraintLayout и GridLayout, и их можно использовать, чтобы указывать, где находятся объекты на экране.

Создать пользовательский интерфейс довольно просто. Есть множество предварительно запрограммированных кнопок и представлений, которые можно перетаскивать. За пару секунд я смог скинуть экран электронной почты и пароля.

Проблема в том, что нажатие "Отправить" ничего не делает. В кнопке нет логики, и мне нужно научиться это делать.

Осмотрев AndroidStudio, вы обнаружите, что в окне проекта есть несколько папок и подпапок, которые требуют изучения. Я понятия не имею, для чего они нужны, хотя похоже, что в папке res ›drawable я храню изображения.

2 января:

Пока что курс взят на отличное начало. Я научился создавать различные кнопки с нуля с помощью Java. Это намного сложнее, чем просто перетаскивание для создания пользовательского интерфейса. Вам необходимо создать объект для макета, объект для кнопки / виджета / представления, которые вы хотите использовать, и еще один объект для определения местоположения кнопки. Мне понравились предлагаемые здесь возможности и гибкость, но пока я думаю, что буду придерживаться перетаскивания кнопок на экран.

3 января:

Сегодня все было посвящено обработке событий или обучению распознаванию, когда пользователь делает с экраном разные вещи. Я сделал простую программу, в которой одна строка текста появляется при быстром нажатии кнопки, а другая появляется при удерживании кнопки некоторое время. Это было достигнуто с помощью методов setOnClickListener и setOnLongClickListener соответственно. Интересно, что эти 2 метода, вероятно, являются причиной того, что ваше приложение включается, когда вы нажимаете на него, но спрашивает, хотите ли вы удалить его, когда вы удерживаете его. Отличное понимание!

Я также научился распознавать жесты с помощью библиотеки GestureDetector. С помощью этого класса вы можете обнаруживать движения пальцев на экране, которые соответствуют одиночным касаниям, двойным касаниям, прокрутке и метанию (резкой прокрутке). Когда я узнаю, как импортировать сложные объекты в приложение, этот метод будет очень полезен для обнаружения типичных взаимодействий жестов.

Я также понял, что вместо того, чтобы создавать каждую кнопку с нуля в Java, гораздо проще перетащить ее в пользовательский интерфейс, а затем «импортировать» ее в код Java с помощью метода findViewByID.

4 января:

Сегодня я узнал о фрагментах, которые, по сути, являются способом получить 2+ действия на одном экране. Например, линия и кнопка представляют собой одно действие, а изображение - это отдельное действие на рисунке ниже.

На данный момент я не совсем уверен, зачем нужно использовать фрагменты ... Приведенный ниже макет можно легко создать без них, но, надеюсь, скоро все станет ясно.

Затем я потратил много времени, пытаясь понять, как заставить появиться счетчик (раскрывающееся меню, которое появляется, когда вы щелкаете стрелку). Я запускал программу десятки раз, но счетчик никогда не появлялся на экране. В конце концов я понял, что у спиннера атрибут минимальной высоты установлен на 0, поэтому, хотя он был там, я не мог его видеть. После установки переменной minHeight примерно на 20 пикселей стрелка стала видимой, и раскрывающееся меню работало должным образом.

Еще у меня была идея для первого приложения. Мне нравится бегать на беговой дорожке, и я периодически смотрю на количество сожженных калорий, чтобы узнать, можно ли съесть лишний Линдт после обеда. Но насколько точно это число? Я хотел бы сделать приложение, в котором вы вводите некоторую информацию о своей пробежке и получаете взамен количество сожженных калорий. Простое приложение и простая попытка проверить номер на беговой дорожке.

Я сделал набросок пользовательского интерфейса ниже. Надеюсь, получится немного красочнее.

5 января:

Сегодня был медленный день. Я узнал, как получить значение класса прядильщика. Вот и все. Надеюсь, завтра я смогу поработать над приложением.

6 января:

Мне удалось заставить мою идею работать сегодня. Это довольно просто, но я горжусь этим, потому что я определенно не смог бы заставить его работать неделю назад. Он использует 5 текстовых представлений (1 невидимый), 4 представления EditText и 1 кнопку. Когда пользователь нажимает кнопку, приложение вычисляет количество сожженных калорий, используя приведенную здесь формулу (https://www.livestrong.com/article/34973-calculate-treadmill-calories/). Точность числа не так важна, как выполнение этапов создания приложения. Также, если пользователь вводит что-то помимо чисел, ему напоминают, что нужно вводить только числа, что было достигнуто с помощью try-catch.

Завтра пройду еще курс.

7 января:

Сегодня я научился пользоваться дополнительными меню. Эти меню используются для открытия новых вкладок в Chrome для Android, поэтому было интересно изучить метод, который я использую каждый день.

Я также изучил основы анимации. Анимация обычно достигается путем указания объекту переместиться из точки A в точку B, но с задержкой, чтобы действие не было мгновенным и могло быть распознано человеческим глазом. В Android это достигается с помощью класса TransitionManager. Я коснулся этого курса только сегодня, и мне не терпится изучить его подробнее.

Я не смог выделить столько времени, сколько хотел бы, на Android за последние два дня, поэтому я определенно сосредоточусь на этом завтра.

8 января:

Сегодня я узнал о намерениях, которые представляют собой объекты, которые вы можете использовать для запуска одного действия из другого действия. Когда вы нажимаете кнопку в приложении и появляется новый экран, этот экран был вызван с помощью намерения. С помощью намерений вы можете переходить от активности синего цвета к активности красного цвета всякий раз, когда нажимается кнопка, и аналогично от активности красного цвета к активности синего цвета.

Я также узнал, как реализовать потоки, которые позволяют запускать 2 или более процессов одновременно. Например, если вы хотите загрузить экран, продолжая позволять пользователю нажимать кнопку, вы должны использовать Thread. Они очень мощные и определенно область, которую мне нужно исследовать.

9 января:

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

Первоначально я пытался воспроизвести некоторые видео с помощью виджета VideoView, и хотя он может воспроизводить файлы .mp4, поскольку Youtube не предоставляет видео в этом формате, VideoView по сути отсекает вас от крупнейшего источника видеоконтента в Интернете. Поэтому я решил использовать Youtube Android Player API, и после этого урока мне удалось получить видео с Youtube для воспроизведения!

Я также научился пользоваться камерой телефона и сохранять сделанные снимки. Я считаю, что это самая крутая вещь, которую я узнал до сих пор, потому что теперь я могу легко переносить сложные пользовательские данные в свои приложения.

10 января:

Большую часть дня я изучал, как создавать уведомления приложений. Это сообщения, которые появляются на вашем телефоне всякий раз, когда вы получаете новый текст или обновление для игры. По сути, это способ приложения сообщить вам, что что-то произошло, без необходимости открывать его. Довольно важный материал. И довольно круто. Смотрите видео ниже.

11 января:

Сегодня я узнал об общих настройках, которые позволяют сохранять пользовательские данные. С помощью общих настроек вы можете гарантировать, что данные сохраняются, когда приложение закрывается, и остаются там, когда приложение открывается еще раз.

12 января:

Сегодня я узнал о ListViews, которые… ну… способ отображать списки вещей. Довольно простые вещи. Смотрите видео ниже.

13 января:

Сегодня я узнал все о базах данных, использующих SQLite, программу управления базами данных. У меня есть некоторый опыт использования SQL в системе Linux, и SQLite был похож. Вы вводите команду SQL так же, как в командной строке, за исключением того, что вы сохраняете команду как строку, а затем передаете ее в метод execSQL для выполнения. Мне это показалось немного сложным, вам нужно правильно указать интервал в строке, иначе компьютер не поймет, что привело к большим проблемам с инициализацией столбца TEXT.

В конце концов я получил это, и, как вы можете видеть в программе ниже, когда вы вводите текстовую строку и нажимаете кнопку «Добавить», строка включается в базу данных слов, которые сохраняются даже при закрытии и повторном открытии программы. Слова также можно легко удалить из баз данных, введя их и нажав кнопку «Удалить». В целом я думаю, что SQLite предлагает большую гибкость, чем общие настройки, которые я узнал 2 дня назад.

14 января:

Сегодня я практиковал ряд вещей, которые узнал за последние две недели, создав простое приложение для измерения ИМТ. Пользователь начинает с домашнего экрана и нажимает кнопку, чтобы перейти на главный экран. Там пользователю предлагается ввести вес, свой рост и нажать кнопку, чтобы рассчитать свой ИМТ, прежде чем ему сообщат, есть ли у него избыточный вес, недостаточный вес или здоровье. Перемещение между экранами осуществлялось с помощью намерений и пользовательского интерфейса, созданного с помощью виджетов EditText, Button и TextView.

15 января:

Сегодня я немного узнал об использовании GoogleMaps API. После получения разрешения на использование API от Google запустить его довольно просто. Почему-то при запуске приложения маркер указывает на Сидней, Австралия. Вместо этого я указал на CNTower. Затем вы можете увеличивать и уменьшать масштаб и перемещаться так же, как в реальных картах GoogleMaps. Мне было бы интересно узнать, как получить GPS-координаты телефона, чтобы при открытии приложения оно сообщало вам, где именно вы находитесь, и я также хотел бы узнать, как вы могли бы запрашивать у пользователя адрес, определять его широту и долготу и поместите маркер на карту.

16 января:

Сегодня я сделал простой секундомер. В верхней части экрана есть счетчик, который увеличивается на 1 каждую секунду после нажатия кнопки запуска, его можно остановить, нажав кнопку остановки, и его также можно сбросить обратно на 0.

Признаюсь, это приложение меня не устраивает. Если вы присмотритесь, то увидите, что если вы нажмете кнопку «Остановить», приложение все равно увеличит время на 1 перед остановкой. Мне потребовалось время, чтобы понять, почему это происходит, и я наконец понял, что это потому, что шкала, которую я использовал для подсчета секунд, была больше, чем скорость, с которой я мог нажимать кнопку. Я переписал указанное выше приложение, чтобы оно считало время в миллисекундах, а не в секундах, и проблема исчезла. Я подозреваю, что именно поэтому приложение для часов, которое поставляется с вашим телефоном, считает время в миллисекундах, а не в секундах.

17 января:

Вышеупомянутого исправления все еще недостаточно. Если вы посмотрите видео, то заметите, что время на секундомере идет медленнее, чем на самом деле. Поразмыслив над этим некоторое время, я понял, что это происходит из-за того, как я держу время. У меня есть переменная счетчика, которую я увеличиваю, скажем, на 100, чтобы учесть прохождение 100 миллисекунд. Затем я фактически задерживаю программу на 100 миллисекунд, прежде чем снова увеличивать значение счетчика. Проблема в том, что время между приращениями переменной счетчика может превышать 100 мс. Обновление textView с использованием текущего времени может занять дополнительные 5–20 мс, и, возможно, задержка составит 101 мс вместо 100. После пары циклов это приводит к тому, что приложение отстает от фактического секундомера. Обходной путь - использовать метод System.currentTimeMillis (), который позволяет телефону отслеживать истекшее время. Сделав текущее время равным System.currentTimeMillis () - (Time When App Started), у вас всегда будет время, которое прошло, независимо от того, заняло ли обновление textView 10 или 500 мс.

Я также наконец узнал, как предотвратить сброс всех переменных при изменении ориентации телефона с помощью метода onSaveInstanceState.

18 января:

Сегодня я узнал о флажках, которые, как следует из названия, представляют собой поля, в которых можно хранить флажки. Это быстрый и простой способ сохранить предпочтения пользователя в отношении ряда решений.

Конечно, проблема с использованием флажков заключается в том, что бывают случаи, когда вы хотите выбрать только один вариант или другой, например, включить или выключить что-то. Вы не можете быть включенным и выключенным одновременно. Чтобы предоставить пользователям возможность выбора 1 и только 1 варианта, мы используем radioButtons с примером ниже.

19 января:

Сегодня я сделал простое «приложение для кофейни», в основном используя списки. Идея состоит в том, что пользователю предоставляется несколько вариантов выбора, он щелкает по одному из них, чтобы перейти на другой экран с вариантами выбора, выбирает один из них и получает некоторую информацию. Это был хороший обзор того, как работают listViews

20 января:

Сегодня я узнал о NavigationDrawer, который представляет собой выдвижное меню, которое позволяет легко перемещаться по вашему приложению. Я сделал простое приложение для пиццы, в котором с помощью NavigationDrawer пользователь мог заказывать пиццу, просматривать меню, просматривать дневные предложения и дополнительные услуги, а также связываться с приложением и оценивать его. Мне это и вправду нравится. Единственный недостаток, о котором я могу думать, - это когда вы получаете доступ к NavigationDrawer, меню скрывает приложение, что может нарушить погружение пользователя.

21 января:

Сегодня был медленный день, я потратил его на изучение того, как использовать ActionBar, панель инструментов в верхней части приложения, которая позволяет добавлять значки. Каждый значок может быть связан с определенным действием, которое вызывается при нажатии. В простом приложении ниже щелчок по значку заставляет пользователя переключать действия. Также я нашел отличный набор бесплатных иконок, которые пригодятся в будущем здесь: https://material.io/icons/

22 января:

Сегодня я немного узнал о cardViews, которые позволяют размещать информацию в макетах с закругленными углами. Ничего особенного, но вы можете предпочесть то, как оно выглядит в приложении.

Я также узнал о scrollViews, которые я считаю одной из самых интересных и захватывающих тем, которые я рассмотрел до сих пор в курсе. Они необходимы, когда вы хотите представить контент, размер которого превышает то, что может вместить экран. Я сделал столбец из 4 cardView, которые растянулись по экрану, и с помощью scrollView пользователь мог просматривать их все. Довольно круто.

Наконец, я также научился пользоваться акселерометром, который идет в комплекте с телефоном. Как вы можете видеть на видео ниже, телефон может отслеживать ваши относительные положения X, Y и Z в трехмерном пространстве. Первые несколько секунд телефон неподвижно лежит на моем столе, в последние несколько секунд я пытаюсь истерически махать им, что вызывает некоторое изменение переменных. Я понимаю, как вы могли бы обучить программу распознавать определенные комбинации изменений X, Y и Z, которые связаны с определенными движениями, и, следовательно, научить приложение распознавать, когда вы завершили шаг в рамках программы шагомера. Очень аккуратный.

24 января:

Я почти дошел до конца курса, и остался один набор модулей - создание приложения по недвижимости. Мне нравится это приложение, потому что оно требует от вас использования почти всего, что описано в курсе: TextViews, Buttons, Intents, Clicking Events, Navigation Tool Bars, Google Map APIs, ScrollViews и т. Д. В конце вы получаете довольно прилично выглядящее приложение с экраном входа в систему, меню с параметрами для просмотра прокручиваемого списка изображений, карту Google с отмеченными местоположениями фиктивных магазинов, список отзывов и страницу контактов. Хороший способ завершить курс.

Если вы зашли так далеко, я хотел бы сказать спасибо за чтение, и я надеюсь, что этот обзор может дать вам некоторое представление о том, подходит ли этот курс для вас.