6 января 2013 в 19:36

Программирование под Android для начинающих. Часть 1 из песочницы 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.
image

Мой первый проект под Android: интерфейс

Первой нашей программой под Android будет таймер, показывающий обратный отсчет от 10 секунд после нажатия кнопки. Прежде чем писать код, нужно создать интерфейс — то, что пользователь увидит, запустив наше приложение. Нужно открыть res/layout/activity_countdown.xml и создать XML шаблон — с помощью редактора Eclipse или текстового/XML редактора ввести следующее:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
      <TextView 
          android:id="@+id/time_display_box" 
          android:layout_width="wrap_content" 
          android:layout_height="wrap_content" 
          android:layout_alignParentTop="true" 
          android:layout_centerHorizontal="true" 
          android:layout_marginTop="60dp" 
          android:text="@string/_00_30" 
          android:textAppearance="?android:attr/textAppearanceLarge"/>
      <Button
          android:id="@+id/startbutton"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_below="@+id/time_display_box"
          android:layout_centerHorizontal="true"
          android:layout_marginTop="41dp"
          android:text="@string/start" />
    
</RelativeLayout>


Обратите внимание на @string/start и @string/__00_30. Их значения будут расположены в res/values/strings.xml:
<string name="start">Start</string>
<string name="_00_30">00:30</string>


Это общепринятый способ обращения к ресурсам в 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-приложения, и сделаем некоторые улучшения нашей программы: ввод времени обратного отсчета, кнопку Stop и меню. Также мы запустим его на реальном устройстве, а не на эмуляторе.

Более подробную информацию вы можете найти в разделе Android Development Training сайта The Linux Foundation's Linux training website.

Juliet Kemp
Оригинал статьи
+16
354324
909
DejmosSm 4,5

Комментарии (27)

+10
Tibr, #
Второй сезон обучения разработке под Андроид на хабре объявляется открытым. Видимо мало нам было позапрошлогодней горы туториалов.
–1
DejmosSm, #
Боитесь конкуренции со стороны новых разработчиков?
+6
Tibr, #
Боюсь? Нет. Считаю, что более продвинутые статьи нужно писать, туториалов же полно, зачем их множить? А конкуренция — это хорошо, незачем её бояться.
–3
DejmosSm, #
Согласен. Однако для меня перевод был одним из способов лучше вникнуть в туториал, т.к. за Android взялся буквально пару дней назад. Позже постараюсь сделать что-то более продвинутое.
Ну а будет ли здесь выложено продолжение перевода данного курса — зависит от отзывов к этой части.
+6
Tibr, #
Рекомендую переводить что-нибудь с android-developers.blogspot.com, там временами очень полезные вещи публикуются.
+5
Quiz, #
Я ещё ни одного приемлемого туториала не встретил. И, видимо, его не будет. Почему-то авторы таких туториалов считают, что по умолчанию я должен быть знаком с разработкой на Java и знать как минимум две популярные IDE.
И никто не пишет туториалов для нубов, знакомых с, например, программированием на C# и смутно представляющих себе сам процесс разработки под Android.

Разубедите меня, если я не прав.
–1
bershadskiy, #
Думаю, Вы абсолютно правы. Я начинал именно зная С#, и такие туториалы рождали больше вопросов, чем давали ответов.

А туториалов не будет, потмоу что на их написание необходимо потратить время и немалое. А кто в наше время хочет тратить его на благотворительность? Таких единицы. И нужно сказать огромное спасибо людям, которые живут на популярных девелопер форумах и дают там адекватные ответы на абсолютно «нубские» вопросы без попыток унизить вопрошающего.
0
Mephistophele, #
Вы абсолютно не правы. Я начинал зная именно C#. Последовательность моих действий была примерна такая:
1. Нашёл самую рекомендуемую IDE — оказался Eclipse.
2. Читал параллельно 2 книжки: Блинов Java и нашёл какую-то по Android. Ни первую, ни вторую до конца не дочитал. Первую несколько глав прочёл чтобы иметь общее представление о фишках Java, т.к. синтаксис очень похож на C#. По андройду так вообще бросил читать после 100 страниц где-то: перевод гавно и пачку туториалов низкопробных запихнули в книгу, хотя судя по амазону книга пользовалась спросом.
3. Затем обратился к гуглу с просьбой дать ссылок на внутреннее устройство андройда. Он выдал.
4. Написал несколько простейших программ.

Итого: 2 недели времени вечерами и пару дней выходных, думаю что на уровень junior я вышел, а дальше только практика.

Сейчас могу уже дать больше инфы по данному вопросу:
1. Использую IDEA — сработали личные предпочтения, сложно привыкнуть было к Eclipse после Visual Studio.
2. Java начинать изучить, всё так же буду рекомендовать Блинова.
3. Из интернет ресурсов: startandroid.ru и stackoverflow.com в паре с незабвенным google.

Чтобы стартануть этого более чем придостаточно.
0
bershadskiy, #
Согласен, но мои слова были именно о туториалах, подобных этому.

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

Таким образом, на поиск причин «что не так, во всех примерах так написано и работает» я тратил намного больше времени, чем мог себе позволить. Должен заметить, что после правильного вопроса в нужном месте проблема обычно решалась в течении нескольких часов.

После 3 месяцев работы с платформой я уже мог решать типовые задачи весьма быстро. Вопросов по реализации остается всё меньше, решаютсяо ни всё быстрее.

Я не пытаюсь ругать автора. Много раз после решения очередной «очевидной» проблемы я хотел написать туториал по решенному вопросу. Но кахждый раз смелости и таланта не хватало. Я просто призываю автора тратить свое время на что то более полезное.
+6
Tibr, #
Почему-то авторы таких туториалов считают, что по умолчанию я должен быть знаком с разработкой на Java
Что значит почему-то? Прежде чем писать что-то под Android на Java строго рекомендуется узнать, что же такое Java. Точно так же, программируя на уровне SL4A, используя, к примеру, Python, Вам строго рекомендуется знать, а что же это за Пайтон такой, иначе, что вы вообще тут делаете? Какой смысл изучать теорию матриц без знания цифр от 0 до 9? Зачем соваться в Web разработку без знания HTML/XHTML?

Да и в чем, собственно, проблема разобраться с IDE? В тех же позапрошлогодних статьях множество туториалов, включающих себя скрины Эклипса с пояснениями.

А Вы наверное хотели, чтобы можно было программировать на C# в IDE от Microsoft? Не, извините, так не бывает, насколько я знаю.
НЛО прилетело и опубликовало эту надпись здесь
0
Tibr, #
Если я не программировал на Java, но хочу научиться программировать под Android, я не думаю что мне предварительно нужно изучить написание десктопных приложений на Java, что бы понять что такое Java
Причем здесь десктопные приложения на Java? Это вообще отдельная тема.

Нужно просто ознакомиться с языком предварительно. Метафорически излагая, как Вы хотите писать статьи на русском языке, не зная русского языка? Никто не требует опыта промышленной разработки на Java SE. Думайте, что пишете.

Серии «Для чайников» тоже нужны, когда человеку нужно именно показать направление к цели. Объяснить азы программирования на Java, описать среду Eclipse, например, описать ее настройку для программирования под Android и т.д


Для этого существует HelloWorld. Базовые знания Вы получите, а далее уже изучать Java нужно отдельно, а не только вкупе с Android, иначе будете в перспективе сталкиваться с неочевидными техническими проблемами, которые на самом деле очевидны.
0
Mephistophele, #
А Вы наверное хотели, чтобы можно было программировать на C# в IDE от Microsoft? Не, извините, так не бывает, насколько я знаю.


Я Вас чуть-чуть потроллю проинформирую:
C# for android
+1
silentnuke, #
напишите в ЛС, чтобы вы примерно хотели видеть в туториале, так же можно какие-то темы, в свободное от работы время могу по немногу заниматься этим вопросом.
0
1111paha1111, #
Если иностранный язык не преграда, попробуй освоить Beginning Android™ 4 Application Development by Lee Wei-Meng. Доходчивое изложение на примерах относительно свежей пока ещё версии Android 4.0. Не требует глубоких знаний Java, Eclipse.

Всё же, язык нужно знать и ты рано или поздно к этому придёшь. Сам когда начинал разбираться с более сложными примерами для Android, столкнулся с непонятными конструкциями анонимных внутренных классов (имею опыт более 5 лет на C#/.NET).
+5
lfway, #
О, сотый хеллоуворльд на эту тему.
+9
Bublik, #
А теперь давай изменим ориентацию экрана и посмотрим на счетчик ;)
+1
karvai, #
д
+14
bershadskiy, #
Сам начал заниматься разработкой под Андроид год назад. Дожен скаать, что именно такие вот переводы недоуроков и вводили меня поначалу в состояние аффекта и вызывали тяжеые припадки ненависти ко всему живому.

Причина в том, что в подобных материалах абсолютно не уделяется внимание такому вопросу, как «почему мы так делаем». Две фразы, которые абсолютно точно характеризуют данный материал, это «Приведенный здесь код должен работать на версиях 4.0 и 2.3» а также «Класс CountDownTimer делает за нас почти всю работу, что очень приятно». В двух словах «Перетащите кнопку на экран и она должна заработать». После прочтения подобных заявлений в какой-то из статей я стабильно проводил около 2-3 дней на stackoverflow и официальной документации разработчику в поисках ответа, почему не работает то, что «должно работать».

Огромнаяпросьба к автору, если Вашей целью является заработать карму за перевод статей, то так и напишите, если Вы пытаетесь помочь этой статьей начать программировать под Андроид желающим научится — не стоит, не вводите людей в сладкое заблуждение простотой этих строк. Пускай сразу сталкиваются с правильными ресурсами, а не тратят время и нервы на малосожержательные статьи.
+4
vadimzz, #
+100500
очевидное каждому начинающему разработчику:

android:textAppearance="?android:attr/textAppearanceLarge"

Без него пример был бы неполным :)
+2
ramntry, #
Действительно. Статья вида «откройте вооон то окошко, скопипасте туда воооооот этот код, нажмите кнопку „сделать хорошо“. Видите, как просто создавать приложения для платформы Android?». То, что это перевод, а не ваше творение, автор, делает вам честь.
+2
Ivnika, #
Да ладно вам ругать статью. Ведь могло быть 4/5 установка эклипса со скринами и в конце «а теперь вставьте вот этот код и запустите».
0
burjui, #
Никогда не понимал таких аргументов:
— Блин, что у нас за страна такая: X делают плохо, а Y вообще нет!
— А в Африке дети голодают.
Могло бы быть, да. Но статья ничуть не прибавляет в качестве оттого, что какая-то другая — говно. Это вообще нелогично же.
+2
niosus, #
Все уже сотню раз сделано. Реально вопрос — зачем. Первая ссылка туториалов по Андроиду выдает вот это. И этого сайта для начала более чем достаточно. Плюс здоровая голова на плечах, конечно.
0
silentnuke, #
«Лучше всего начинать разработку под одну из версий: 4.0 (Ice Cream Sandwich) или 2.3 (Gingerbeard), особенно с учетом того, что версии Android поддерживают обратную совместимость (т.е. ваш код для версии 2.3 будет работать и на 4.2), а приложения, „
чем лучше, кому лучше?

“Немного о версиях: последней версией Android является 4.2 (Jelly Bean), но, как можно выдеть по этой диаграмме, она еще недостаточно распространена. „
зачем приводить ссылку на сторонние источники, когда есть куда более официальные, обновляемые, и куда наглядные?
developer.android.com/intl/ru/about/dashboards/index.html

“С помощью команды «Run» в Eclipse вы можете запустить созданное приложение, при этом будет автоматически запущен эмулятор Android.»
а как же то, что для того, чтобы эмулятор запустился, нужно как минимум 1 до этого создать, а то иначе что запускать?)
+1
Quiz, #
В очередной раз добавляю статью в избранное только ради комментариев.
0
XaBoK, #
Решил дай ка я всё-таки попробую посмотреть на андройд приложения изнутри. Вот и туториал свежий.
Вот только не переводчик видимо не потрудился проверить материал статьи.

Копирование кода сразу выдаёт кучу ошибок компиляции. Возможно для автора (оригинала) — это пустяк, но я не специалист. Эклипс подсказал какие импорты нужно добавить, но почему этого нет в примере?
Нажимаю Run — тоже ошибки. Вот уже в коментах пишут, нужно как минимум до этого создать эмулятор. Как это сделать?
Зачем вообще такой материал нужен, если ничего не работает?

Только зарегистрированные пользователи могут оставлять комментарии.
Войдите, пожалуйста.