Главная » Разработка для Android » Создание приложения Earthquake Viewer

0

В следующем примере1 вы создадите инструмент,  который использует информационный поток Геологической  Службы  США  (USGS) для ото- бражения  списка последних землетрясений.

ПРИМЕЧАНИЕ

Позже вы неоднократно будете возвращаться к этому примеру. В гла- вах 6 и 7 добавите сохранение настроек и распространение информа- ции о землетрясениях через Источник данных, в главах 8 и 9 внедрите поддержку картографии и переместите процесс обновления исходных данных в Сервис.

В этом примере вы создадите Активность, основанную на ListView, ко- торая подключается к потоку данных и выводит на экран местоположение, магнитуду и время начала содержащихся там землетрясений. Используй- те объект AlertDialog для отображения окна, которое содержит  элемент TextView  со ссылкой на сайт организации USGS.

ПРИМЕЧАНИЕ

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

9. Запустив свой проект, вы должны увидеть элемент  ListView, содер- жащий  землетрясения за последние  24 часа, у которых  магнитуда превышает 2,5. Внешний вид приложения показан на рис. 5.6.

Рис. 5.6.

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

10.1.Начните с добавления  нового внешнего строкового  ресурса для пункта меню.

<string name="menu_update"> Refresh Earthquakes

</string>

10.2.Затем переопределите методы Активности onCreateOptionsMenu и onOptionsItemSelected, чтобы отображать пункт меню Refresh Earthquakes и обрабатывать  его нажатие.

static final private int MENU_UPDATE = Menu.FIRST;

@Override

public boolean onCreateOptionsMenu(Menu menu) {

super.onCreateOptionsMenu(menu);

menu.add(0, MENU_UPDATE, Menu.NONE, R.string.menu_update);

return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

super.onOptionsItemSelected(item);

switch (item.getItemId()) {

case (MENU_UPDATE): { refreshEarthquakes(); return true;

}

}

return false;

}

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

11.1.Создайте новый ресурс с разметкой quake_details.xml для диа- логового окна, которое будет отображаться при выборе элемента.

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"

android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10dp">

<TextView android:id="@+id/quakeDetailsTextView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textSize="14sp"

/>

</LinearLayout>

11.2.Отредактируйте метод onCreate, добавив в него реализацию ин- терфейса ItemClickListener для ListView, чтобы выводить на экран диалоговое окно при нажатии элемента с землетрясением.

static final private int QUAKE_DIALOG = 1; Quake selectedQuake;

@Override

public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main);

earthquakeListView = (ListView)this.findViewById(R. id.earthquakeListView);

earthquakeListView.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView _av, View _v, int _index, long arg3) {

selectedQuake = earthquakes.get(_index);

showDialog(QUAKE_DIALOG);

}

});

int layoutID = android.R.layout.simple_list_item_1;

aa = new ArrayAdapter<Quake>(this, layoutID , earthquakes);

earthquakeListView.setAdapter(aa);

refreshEarthquakes();

}

11.3.Переопределите методы onCreateDialog и onPrepareDialog, чтобы создать и заполнить данными объект AlertDialog.

@Override

public Dialog onCreateDialog(int id) {

switch(id) {

case (QUAKE_DIALOG) :

LayoutInflater li = LayoutInflater.from(this);

View quakeDetailsView = li.inflate(R.layout.quake_details, null);

AlertDialog.Builder quakeDialog = new AlertDialog.Builder(this); quakeDialog.setTitle("Quake Time"); quakeDialog.setView(quakeDetailsView);

return quakeDialog.create();

}

return null;

}

@Override

public void onPrepareDialog(int id, Dialog dialog) {

switch(id) {

case (QUAKE_DIALOG) :

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); String dateString = sdf.format(selectedQuake.getDate());

String quakeText = "Magnitude " + selectedQuake.getMagnitude() + "\n" + selectedQuake.getDetails() + "\n" + selectedQuake.getLink();

AlertDialog quakeDialog = (AlertDialog)dialog;

quakeDialog.setTitle(dateString);

TextView tv = (TextView)quakeDialog.findViewById

(R.id.quakeDetailsTextView);

tv.setText(quakeText);

break;

}

}

11.4.В завершение  примените  к диалогу Linkify, чтобы создать гипер- ссылку на сайт организации USGS. Поправьте описание разметки диалогового окна, включив в нее атрибут autolink.

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"

android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10dp">

<TextView android:id="@+id/quakeDetailsTextView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textSize="14sp" android:autoLink="all"

/>

</LinearLayout>

Еще раз запустите  свое приложение. Если щелкнуть  на каком-нибудь землетрясении, появится диалоговое  окно и частично  перекроет  список, как показано на рис. 5.7.

Рис. 5.7.

Резюме

Основное  внимание  в этой главе уделялось  интеграции  компонентов вашего приложения.

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

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

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

Познакомились с Адаптерами, которые  использовались для привязки исходных  данных к визуальным компонентам.  В частности,  узнали,  как применять ArrayAdapter и SimpleCursorAdapter для привязки элемента ListView к массивам ArrayList  и Курсорам.

Наконец,  вы усвоили  основные  принципы подключения к Интернету и применения удаленных потоков в качестве источников  данных для род- ных клиентских приложений.

Вы также узнали:

как использовать Linkify для добавления  неявных  намерений  в эле- менты TextView  во время выполнения программы;

какие стандартные  действия  в Android  доступны  для расширения, замены или перехвата;

как использовать Фильтры намерений, чтобы позволить собственным Активностям обрабатывать дополнительные действия, которые отправ- ляются вашими или любыми другими приложениями;

каким  образом  отслеживать транслируемые Намерения, используя

Широковещательные приемники;

как использовать Активности в качестве диалоговых окон.

В следующей главе вы научитесь обеспечивать постоянство данных внутри своих приложений. Android предоставляет механизмы для сохранения данных приложения, включая файлы, простые настройки и полноценные реляцион- ные базы данных (используя библиотеку SQLite). В главе 6 основное внимание уделено использованию настроек и сохранению состояний Активности, в гла- ве 7 рассмотрены  Источники данных и базы данных на основе SQLite.

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии