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

0

В следующем примере вы опять расширите  возможности приложения Earthquake, но на этот раз с помощью Живого каталога, который отображает магнитуду и местоположение каждого землетрясения.

1. Начните с редактирования класса EarthquakeProvider. Создайте новое статическое  поле с путем URI, которое будет использовано для воз- вращения  элементов Живого каталога.

public static final Uri LIVE_FOLDER_URI = Uri.parse("content://com.paad.provider.earthquake/live_folder");

2. Измените объект uriMatcher и метод getType,  чтобы иметь возмож- ность обрабатывать  запросы к новому URI.

private static final int LIVE_FOLDER = 3;

static {

uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

uriMatcher.addURI("com.paad.provider.Earthquake", "earthquakes", QUAKES);

uriMatcher.addURI("com.paad.provider.Earthquake", "earthquakes/#", QUAKE_ID);

uriMatcher.addURI("com.paad.provider.Earthquake", "live_folder", LIVE_ FOLDER);

}

@Override

public String getType(Uri uri) {

switch (uriMatcher.match(uri)) {

case QUAKES|LIVE_FOLDER :

return "vnd.android.cursor.dir/vnd.paad.earthquake";

case QUAKE_ID: return "vnd.android.cursor.item/vnd.paad.earthquake";

default: throw new IllegalArgumentException("Unsupported URI: " + uri);

}

}

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

static final HashMap<String, String> LIVE_FOLDER_PROJECTION;

static {

LIVE_FOLDER_PROJECTION = new HashMap<String, String>(); LIVE_FOLDER_PROJECTION.put(LiveFolders._ID,

KEY_ID + " AS " + LiveFolders._ID); LIVE_FOLDER_PROJECTION.put(LiveFolders.NAME,

KEY_DETAILS + " AS " + LiveFolders.NAME); LIVE_FOLDER_PROJECTION.put(LiveFolders.DESCRIPTION,

KEY_DATE + " AS " + LiveFolders.DESCRIPTION);

}

4. Отредактируйте метод query, чтобы применить ассоциативный массив из предыдущего  пункта при запросе, который  направлен  к Живому каталогу.

@Override

public Cursor query(Uri uri,

String[] projection, String selection, String[] selectionArgs, String sort) {

SQLiteQueryBuilder qb = new SQLiteQueryBuilder();

qb.setTables(EARTHQUAKE_TABLE);

switch (uriMatcher.match(uri)) {

case QUAKE_ID :

qb.appendWhere(KEY_ID + "=" + uri.getPathSegments().get(1));

break;

case LIVE_FOLDER : qb.setProjectionMap(LIVE_FOLDER_PROJECTION);

break;

default : break;

}

[ … ранее написанный код … ]

}

5. Создайте  новый класс EarthquakeLiveFolders, который  будет содер- жать статическую  Активность EarthquakeLiveFolder.

package com.paad.earthquake;

import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle;

import android.provider.LiveFolders;

public class EarthquakeLiveFolders extends Activity {

public static class EarthquakeLiveFolder extends Activity {

}

}

6. Добавьте  новый метод, который  определяет  Намерение, нужное для создания Живого каталога. Оно должно использовать путь URI, создан- ный вами на шаге 1, устанавливать режим отображения для списка, определять  значок  и заголовочный текст. Установите также базо- вое Намерение для запроса  к единичной  записи  в Источнике данных EarthquakeProvider.

private static Intent createLiveFolderIntent(Context context) { Intent intent = new Intent(); intent.setData(EarthquakeProvider.LIVE_FOLDER_URI); intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_BASE_INTENT,

new Intent(Intent.ACTION_VIEW, EarthquakeProvider.CONTENT_URI));

intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_DISPLAY_MODE, LiveFolders.DISPLAY_MODE_LIST);

intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_ICON, Intent.ShortcutIconResource.fromContext(context,

R.drawable.

icon));

intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_NAME, "Earthquakes");

return intent;

}

7. Переопределите метод onCreate для класса  EarthquakeLiveFolder, чтобы возвращать  Намерение, созданное на шаге 6.

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

String action = getIntent().getAction();

if (LiveFolders.ACTION_CREATE_LIVE_FOLDER.equals(action))

setResult(RESULT_OK, createLiveFolderIntent(this));

else setResult(RESULT_CANCELED);

finish();

}

8. Добавьте  Активность EarthquakeLiveFolder в манифест  приложения, включив Фильтр намерений для действия android.intent.action.CREATE_ LIVE_FOLDER.

<activity android:name=".EarthquakeLiveFolders$EarthquakeLiveFolder" android:label="All Earthquakes">

<intent-filter>

<action android:name="android.intent.action.CREATE_LIVE_FOLDER"/>

</intent-filter>

</activity>

На рис. 10.5 показан  Живой каталог с землетрясениями, открытый  на домашнем экране.

Рис. 10.5.

Вы можете дополнить этот пример, выводя на карте конкретное  земле- трясение, выбранное из списка.

Начните  с добавления  Фильтра намерений к Активности EarthquakeMap. Он будет отслеживать действия  с Источником данных EarthquakeProvider, описанным с помощью объекта Intent, который был создан на шаге 6. Потом сделайте так, чтобы Активность могла получать местоположение выбранного землетрясения и прокручивать карту к этой точке.

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

По теме:

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