Начать разработку для Android с Eclipse, Reloaded

В первый part этого руководства, мы создали простое приложение, таймер варево использование Android и Eclipse.В этой второй части, мы будем продолжать разработку приложений за счет добавления дополнительных функциональных возможностей.При этом, вы познакомитесь с некоторыми важными и мощных возможностей Android SDK, в том числе постоянного хранения данных, деятельности и намерениях, а также общей пользователю preferences.

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

$ git clone git://github.com/cblunt/BrewClock.git
$ cd BrewClock
$ git checkout tutorial_part_1

После того как вы проверили код на GitHub, вам нужно импортировать проект в Eclipse:

  1. Запуск Eclipse, и выбери Файл → Импорт …
  2. В окне Импорт выберите “Существующие проекты в рабочей области” и нажмите
  3. В следующем окне нажмите кнопку “Обзор” и выберите папку проекта, что вы клонировали из GitHub.
  4. Нажмите кнопку “Готово”, чтобы импортировать ваш проект в Eclipse.

После импорта проекта в Eclipse, вы можете получить предупреждение:

Android required .class compatibility set to 5.0.
Please fix project properties.

Если это так, то щелкните правой кнопкой мыши на вновь импортирован “BrewClock” проект в “Project Explorer”, выберите “Свойства проекта Fix”, а затем перезапустить Eclipse.

Начало работы с данными Storage

В настоящее время BrewClock позволяет пользователям устанавливать определенное время для пивоварения свои любимые чашки чая.Это замечательно, но что, если они регулярно пить различные чаи, каждый со своим разное время пивоварения?На данный момент, пользователи должны помнить, пивоваренной время для всех своих любимых чаев!Это не делает для большой опыт пользователя.Итак, в этом уроке мы будем развивать функциональные возможности позволяют пользователям раза магазине пивоварения для своего любимого чая, а затем выбрать из этого списка чаев, когда они делают brew.

Чтобы сделать это, мы будем воспользоваться богатым хранения данных API Android.Android предлагает несколько способов хранения данных, два из которых мы рассмотрим в этой статье.Первый, более мощный вариант, использует движок SQLite базы данных для хранения данных для наших application.

SQLite является популярным и легкий движок базы данных SQL, которая сохраняет данные в одном файле.Он часто используется в настольных и встраиваемых приложениях, где работает клиент-сервер SQL двигателя (таких как MySQL или PostgreSQL) не feasible.

Каждое приложение, установленное на устройстве Android можно сохранить и использовать любое количество SQLiteфайлов базы данных (в зависимости от емкости), которая будет управлять системой автоматически.Базам данных приложения являются частными, и поэтому не могут быть доступны для любых других приложений.(Данные могут быть разделены через ContentProvider класса, но мы не будем рассматривать контент-провайдеров в этом учебнике.) База данных файлов сохраняются при обновлении приложения и удаляются, когда приложение uninstalled.

Мы будем использовать простую базу данных SQLite в BrewClock вести список чаев и их соответствующее время заваривания.Вот краткий обзор того, как наша схема базы данных будет выглядеть так:

+-------------------------------------+
| Table: teas                         |
+------------+------------------------+
| Column     | Description            |
+------------+------------------------+
| _ID        | integer, autoincrement |
| name       | text, not null         |
| brew_time  | integer, not null      |
+------------+------------------------+

Если вы работали с SQL и раньше, это должно выглядеть довольно знакомой.Таблицы базы данных имеет три колонки: уникальный идентификатор (_ID), имя и пивоваренной времени.Мы будем использовать API, предоставляемые Android для создания таблиц базы данных в нашем коде.Система будет заботиться о создании файла базы данных в нужном месте для нашей application.

Абстрагируясь Database

Для обеспечения баз данных код прост в обслуживании, мы будем абстрактные весь код для работы с создания базы данных, вставки и запросов в отдельный класс, TeaData.Это должно быть довольно знакомым, если вы привыкли к модель-представление-контроллер подход.Все базы данных код хранится в отдельном классе наших BrewClockActivity.Деятельность можете просто создать новый TeaData экземпляра (который будет подключаться к базе данных) и делать то, что он должен делать.Работая в этом случае позволяет легко изменять базу данных в одном месте, без необходимости что-либо менять в любой другой части нашего приложения, которые занимаются database.

Создайте новый класс, называемый TeaData В проекте BrewClock выбрав в меню Файл → Новый → класса.Убедитесь, что TeaData расширяет android.database.sqlite.SQLiteOpenHelper “. Конструкторы из суперкласса” класс, и что вы установите флажок для

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

Добавить две константы до TeaData сохранить название и версию базы данных, имя таблицы и имена столбцов в этой таблице.Мы будем использовать Android-при условии постоянной BaseColumns._ID уникальный идентификатор для таблицы столбец:

// src/com/example/brewclock/TeaData.java
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.provider.BaseColumns;

public class TeaData extends SQLiteOpenHelper {
  private static final String DATABASE_NAME = "teas.db";
  private static final int DATABASE_VERSION = 1;

  public static final String TABLE_NAME = "teas";

  public static final String _ID = BaseColumns._ID;
  public static final String NAME = "name";
  public static final String BREW_TIME = "brew_time";

  // …
}

Добавить конструктора до TeaData, который вызывает его родительский метод, поставляя нашим именем и версии базы данных.Android будет автоматически обрабатывать открытия базы данных (и, создавая его, если он не существует)

// src/com/example/brewclock/TeaData.java
public TeaData(Context context) {
  super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

Нам нужно переопределить onCreate метод, чтобы выполнить строку SQL команд, которые создают таблицы базы данных для нашего чая.Android будет обрабатывать этот метод для нас, называя onCreate, когда файл базы данных первая created.

На последующихзапускает, Android проверяет версию базы данных против DATABASE_VERSION номер мы поставили в конструктор.Если версия изменилась, Android будет вызывать onUpgrade метод, который является, где можно было бы написать любой код, чтобы изменить структуру базы данных.В этом уроке, мы просто просим Android отбрасывать и заново database.

Итак, добавить следующий код в onCreate:

// src/com/example/brewclock/TeaData.java
@Override
public void onCreate(SQLiteDatabase db) {
  // CREATE TABLE teas (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, brew_time INTEGER);
  String sql =
    "CREATE TABLE " + TABLE_NAME + " ("
      + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
      + NAME + " TEXT NOT NULL, "
      + BREW_TIME + " INTEGER"
      + ");";

  db.execSQL(sql);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
  onCreate(db);
}

Следующее, мы добавим новый метод TeaData, что позволяет нам легко добавлять новые записи чая в базе данных.Мы поставляем метод с именем и пивоваренной время для чая, чтобы быть добавлен.Вместо того, чтобы заставить нас написать сырья SQL сделать это, Android предоставляет набор классов для вставки записей в базе данных.Во-первых, мы создаем множество ContentValues, нажимая на соответствующие значения в это set.

С экземпляром ContentValues, мы просто указать имя столбца и значение для вставки.Android заботится о создании и запуске соответствующего SQL.Использование классов Android база данных гарантирует, что записи являются безопасными, и если механизм хранения данных изменений в будущих версиях Android, наш код будет work.

Добавить новый метод, insert(), к TeaData Класс:

// src/com/example/brewclock/TeaData.java
public void insert(String name, int brewTime) {
  SQLiteDatabase db = getWritableDatabase();

  ContentValues values = new ContentValues();
  values.put(NAME, name);
  values.put(BREW_TIME, brewTime);

  db.insertOrThrow(TABLE_NAME, null, values);
}

Получение Data

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


SQL Query: SELECT * from teas LIMIT 3;

+-----------------------------------+
|  _ID  |  name       |  brew_time  |
+-----------------------------------+
|    1  |  Earl Grey  |          3  |
|    2  |  Green      |          1  | <= Cursor
|    3  |  Assam      |          5  |
+-------+-------------+-------------+

В данном примере курсор указывает на вторую строку в результирующий набор (зеленый чай).Мы могли бы переместить курсор назад строки представляют первую строку (Earl Grey), вызывая cursor.moveToPrevious(), или двигаться вперед к ряду Ассам с moveToNext().Чтобы получить имя чаем, что курсор указывает, мы бы назвали cursor.getString(1), где 1 это столбец индекса столбца мы хотели бы получить (обратите внимание, что индекс начинается с нуля, так что колонки 0,. первая колонка, 1 во второй колонке и так далее)

Теперь, когда вы знаете о курсоры, добавим метод, который создает Cursor объекта, который возвращает все чаи в нашей базе данных.Добавить all метод TeaData:

// src/com/example/brewclock/TeaData.java
public Cursor all(Activity activity) {
  String[] from = { _ID, NAME, BREW_TIME };
  String order = NAME;

  SQLiteDatabase db = getReadableDatabase();
  Cursor cursor = db.query(TABLE_NAME, from, null, null, null, null, order);
  activity.startManagingCursor(cursor);

  return cursor;
}

Давайте рассмотрим этот метод подробнее, потому что это выглядит немного странно на первый взгляд.Опять же, вместо того чтобы писать сырья SQL запрос к базе данных, мы используем базу данных интерфейса Android, methods.

Во-первых, мы должны сказать Android, какие столбцы из нашей базы данных мы заинтересованы Для этого мы создаем массив strings— каждого из столбцов идентификаторов, которые мы определили в верхней части TeaData.Мы также установить колонку, которую мы хотим заказать результатов и хранить его в order string.

Далее, мы создаем только для чтения подключение к базе данных с помощью getReadableDatabase(), и с этой связи, мы говорим Android для запуска запроса с помощью query() метод.query() методимеет набор параметров, которые Android внутренне преобразуется в запрос SQL.Опять же, уровень абстракции Android гарантирует, что наш код приложения, вероятно, продолжит работать, даже если основной хранения данных изменений в будущих версиях Android.

Потому что мы просто хотим, чтобы вернуться каждый чая в базе данных, мы не применяем любые соединения, фильтры или групп (т.е. WHERE JOIN, и GROUP BY положения в SQL) метода.from и order переменные сказать, какие столбцы запроса, чтобы вернуться на базу данных и порядок, в котором они получены.Мы используем SQLiteDatabase.query() метод в качестве интерфейса для database.

Последний, мы просим поставляется активности (в данном случае, наши BrewClockActivity) для управления курсором.Как правило, курсор должен быть вручную обновляется, чтобы перезагрузить любые новые данные, поэтому, если мы добавили новый чай в нашей базе данных, мы должны помнить, чтобы освежить нашу Cursor.Вместо этого, Android может позаботиться об этом для нас, воссоздавая результаты, когда деятельность приостановлена ​​и возобновилась, позвонив по телефону startManagingCursor().

И, наконец, мы добавим еще один полезный метод, возвращающий количество записей в таблице.Еще раз, Android обеспечивает удобную утилиту, чтобы сделать это для нас в DatabaseUtils Класс:

Добавьте следующий метод, count, в TeaData Класс:

// src/com/example/brewclock/TeaData.java
  public long count() {
    SQLiteDatabase db = getReadableDatabase();
    return DatabaseUtils.queryNumEntries(db, TABLE_NAME);
  }

Сохрани TeaData класс и исправить все отсутствующие импорта использованием Eclipse (Источник → Организация импорта).С нашим данным классом закончили, пора менять интерфейс BrewClock, чтобы сделать использование базы данных

Изменить BrewClock в интерфейс, позволяющий чай Selection

Целью сохранения заданного чай и пиво раза, чтобы позволить пользователю быстро выбрать свой любимый чай из пресетов.Чтобы облегчить эту задачу, мы добавим Spinner (аналогично всплывающего меню в настольных интерфейсов) к основному интерфейсу BrewClock, заполняется список чаи из TeaData.

Как и в предыдущем уроке, использовать макет редактор в Eclipse, чтобы добавить Spinner к основному интерфейсу BrewClock в формат файла XML.Добавьте следующий код чуть ниже LinearLayout на этикетке пива количества (около линии 24).Помните, что вы можете переключиться на “Код View” на вкладке в нижней части окна, если затмение открывает визуальный макет editor.

<!-- /res/layout/main.xml -->

<!-- Tea Selection -->
<LinearLayout
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content">

  <Spinner
    android:id="@+id/tea_spinner"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" />

</LinearLayout>

В BrewClockActivity класс, добавить переменную-член ссылаться на Spinner, и подключить его к интерфейсу с помощью findViewById:

// src/com/example/brewclock/BrewClockActivity.java
protected Spinner teaSpinner;
protected TeaData teaData;

// …

public void onCreate(Bundle savedInstanceState) {
  // …
  teaData = new TeaData(this);
  teaSpinner = (Spinner) findViewById(R.id.tea_spinner);
}

Попробуйте запустить приложение, чтобы убедиться, что новый интерфейс работает правильно.Вы должны увидеть пустой всплывающем меню (или Spinner) чуть ниже пиво кол.Если вы нажмете счетчик, Android обрабатывает отображение всплывающего меню, так что вы можете выбрать опцию для счетчика.На данный момент, в меню пусто, поэтому мы исправить это путем связывания Spinner, чтобы наш чай database.

Data Binding

КогдаAndroid извлекает данные из базы данных, он возвращает Cursor объект.Курсор представляет собой набор результатов из базы данных и могут быть перемещены через результаты для получения значений.Мы можем легко связать эти результаты на вид (в данном случае, Spinner), используя набор классов, предоставляемых Android называется Адаптеры делать всю тяжелую работу выборке базы данных результатов от Cursor И отображения их вinterface.

Помните, что наши TeaData.all() метод уже возвращает курсор заполняется содержимым нашем столе чай.С помощью этого курсора, все, что нужно сделать, это создать SimpleCursorAdapter связать свои данные в наш teaSpinner, а Android будет заботиться о заполнении options.

Подключить Курсор возвращается teaData.all() в Spinner, создав SimpleCursorAdapter:

// com/example/brewclock/BrewClockActivity.java

public void onCreate(Bundle savedInstanceState) {
  // …
  Cursor cursor = teaData.all(this);

  SimpleCursorAdapter teaCursorAdapter = new SimpleCursorAdapter(
    this,
    android.R.layout.simple_spinner_item,
    cursor,
    new String[] { TeaData.NAME },
    new int[] { android.R.id.text1 }
  );

  teaSpinner.setAdapter(teaCursorAdapter);
  teaCursorAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
}

Обратите внимание, что мы использовали встроенную android.R объекта.Это дает некоторые общие ресурсы по умолчанию для вашего приложения, такие как простые виды и макеты.В этом случае, мы использовали android.R.layout.simple_spinner_item, которая является простой текстовой метки layout.

Если вы запустите приложение еще раз, вы увидите, что счетчик по-прежнему пуста!Хотя мы связаны счетчика в нашей базе данных нет записей в базе данных display.

Давайте дадим пользователю выбор чаев, добавив некоторые записи по умолчанию в базу данных в конструкторе BrewClock автора.Чтобы избежать дублирующихся записей, мы добавим только чай умолчанию, если база данных пуста.Мы можем использовать TeaData в count() метод, чтобы проверить, является ли это case.

Добавить код, чтобы создать стандартный набор чаев, если база данных пуста.Добавить эту линию чуть выше код, чтобы принести чай из teaData:

// com/example/brewclock/BrewClockActivity.java
public void onCreate(Bundle savedInstanceState) {
  // …

  // Add some default tea data! (Adjust to your preference :) 
  if(teaData.count() == 0) {
    teaData.insert("Earl Grey", 3);
    teaData.insert("Assam", 3);
    teaData.insert("Jasmine Green", 1);
    teaData.insert("Darjeeling", 2);
  }

  // Code from the previous step:
  Cursor cursor = teaData.all(this);

  // …
}

Теперь запустите приложение еще раз.Теперь вы видите, что ваш чай Spinner имеет первый чай выбран.При нажатии на Spinner позволяет выбрать один из чаев из базы данных

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

Хотя сейчас было бы хорошее время для самогона, наша работа еще не закончена.Хотя вы можете выбрать различные чаи из Spinner, делая выбор не делать ничего.Мы должны выяснить, какой чай выбранного пользователем и обновления варево время accordingly.

Читать Выбранный чай, и обновление Brew Time

Чтобы определить, какой чай пользователь выбрал из нашей базы данных, BrewClockActivityНеобходимо прослушивать события.Как и в OnClickListener событие, которое вызвано нажатия кнопок, мы реализуем OnItemSelectedListener.События в этот слушатель срабатывает, когда пользователь делает выбор из представления, такие, как наши Spinner.

Включить onItemSelectedListener в BrewClockActivity, добавив его в объявлении класса.Помните, для реализации методов интерфейса onItemSelected() и onNothingSelected():

// src/com/example/brewclock/BrewClockActivity.java
public class BrewClockActivity extends Activity implements OnClickListener, OnItemSelectedListener {
  // …
  public void onItemSelected(AdapterView<?> spinner, View view, int position, long id) {
    if(spinner == teaSpinner) {
      // Update the brew time with the selected tea’s brewtime
      Cursor cursor = (Cursor) spinner.getSelectedItem();
      setBrewTime(cursor.getInt(2));
    }
  }

  public void onNothingSelected(AdapterView<?> adapterView) {
    // Do nothing
  }
}

Здесь мы проверяем счетчик, который вызвал onItemSelected событие было BrewClock в teaSpinner.Если так, то мы курсором объект, который представляет выбранной записи.Это все обрабатывается для нас SimpleCursorAdapter, которая соединяет teaData в Spinner.Android знает, какой запрос заполняет Spinner и какой пункт выбрал пользователь.Он использует это, чтобы вернуть одну строку из базы данных, представляющие выбранные tea.

Курсора getInt() Метод принимает индекс столбца, мы хотим получить.Помните, что когда мы построили наш курсор в teaData.all(), столбцы мы читаем было _ID, NAME и BREW_TIME.Предположим, что мы выбрали жасминовый чай в teaSpinner, курсор возвращается наш выбор был бы указывая на эту запись в database.

Затем мы просим курсора, чтобы получить значение из столбца 2 (с использованием getInt(2)), которая в этот запрос нашим BREW_TIME колонки.Это значение подается на наших существующих setBrewTime() метод, который обновляет интерфейс, чтобы показать пивоваренной выбранного чая time.

Наконец, мы должны сказать teaSpinner, что BrewClockActivity прослушивает OnItemSelected события.Добавьте следующую строку в BrewClockActivity ‘с onCreate метод:

// src/com/example/brewclock/BrewClockActivity.java
public void onCreate() {
  // …
  teaSpinner.setOnItemSelectedListener(this);
}

Это должно сделать это!Запустите приложение снова, и попробуйте выбрать различные чаи из Spinner.Каждый раз при выборе чая, его варево времени будет показан на часы обратного отсчета.Остальная часть нашего кода уже обрабатывает отсчет от текущего времени пиво, так что теперь у нас есть полностью рабочий варево таймером, со списком заданных teas.

Можно, конечно, вернуться в коде и добавить больше заданного чаи к базе данных в соответствии с вашими вкусами.Но что, если мы выпустили BrewClock на рынок?Каждый раз, когда кто-то хотел, чтобы добавить новый чай в базу данных, мы должны были бы вручную обновить базу данных, и публиковать приложения; каждый будет необходимо обновить, и каждый будет иметь тот же список чаев.Это звучит довольно негибким, и много работы для нас

Было бы гораздо лучше, если у пользователя несколько способов добавить свой чай и предпочтения в базе данных.Мы будем решать, что дальше …

Введение в Activities

Каждый экран в ваше приложение и связанные с ней код Activity.Каждый раз, когда вы переходите от одного экрана к другому, Android создает новую деятельность.В действительности, хотя приложение может содержать любое количество экранов / мероприятий, Androidрассматривает их как отдельные юридические лица.Деятельность работать вместе, чтобы сформировать сплоченную опыт, потому что Android позволяет легко передавать данные между them.

В этом заключительном разделе, вы создадите новую активность (AddTeaActivity), чтобы ваше заявление и зарегистрировать его в системе Android.Вы будете затем передать данные из оригинальной BrewClockActivity этой новой Activity.

Первый, однако, мы должны дать пользователю возможность перейти на новую деятельность.Мы сделаем это с помощью опции menu.

Параметры Menus

Параметры меню всплывающие меню, которые появляются, когда пользователь нажимает клавишу «Меню» на своем устройстве.Android обрабатывает создания и отображения меню настроек, автоматически, вы просто должны сказать ему, какие опции для отображения и что делать, если опция выбрана user.

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

В Project Explorer, перейдите в раздел “RES / значение”, и вы увидите, что strings.xml файл уже существует.Это было создано затмение, когда мы впервые создали проект, и он будет использоваться для хранения любой строки текста, который мы хотим использовать в течение application.

Открытое strings.xml, дважды щелкнув на нем, и перейти на XML, щелкнув strings.xml вкладку в нижней части window.

Добавить следующую строку в <resources>…</resources> элемента:

<!-- res/values/strings.xml -->
  <resources>
    <!-- … -->
    <string name="add_tea_label">Add Tea</string>
  </resources>

Здесь вы определили строку, add_tea_label, и связанные с текстом.Мы можем использовать add_tea_label ссылаться на строку кода всей программы.Если на этикетке должна измениться по какой-то причине в будущем, вам нужно изменить только один раз в этом file.

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

Создать новый Android XML файла в Eclipse, выбрав файл → Новый → Другая, а затем выберите пункт “Android XML-файла”.

Выберите ресурс типа “Меню” и сохраните файл как main.xml.Затмение будет автоматически создавать папки, res/menu, где ваше меню XML файлы будут stored.

Открытое res/menus/main.xml файл, и переключиться в режим XML, нажав кнопку “main.xml” на вкладке в нижней части window.

Добавить новый пункт меню, add_tea.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.and ...

Если вы хотите прочитать полностью статью, посетите сайт наших спонсоров

Comments are closed.