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

0

В главе 5 вы создали приложение Earthquake Viewer, которое выводило список недавних землетрясений, основанный на ленте RSS.

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

ПРИМЕЧАНИЕ

Позже в этой главе вы замените эту Активность на стандартный Экран настроек.

1. Откройте проект Earthquake, созданный  в главе 5. Добавьте  новые строковые ресурсы для тех меток, что будут отображаться в Экране на- строек. Добавьте строку для нового пункта меню, с помощью которого пользователь сможет получить доступ к этой Активности:

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

<resources>

<string name="app_name">Earthquake</string>

<string name="quake_feed">

http://earthquake.usgs.gov/eqcenter/catalogs/1day-M2.5.xml

</string>

<string name="menu_update">Refresh Earthquakes</string>

<string name="auto_update_prompt">Auto Update?</string>

<string name="update_freq_prompt">Update Frequency</string>

<string name="min_quake_mag_prompt">Minimum Quake Magnitude</string>

<string name="menu_preferences">Preferences</string>

</resources>

2. Создайте новый ресурс разметки preferences.xml для Активности Preferences. Добавьте CheckBox, чтобы показывать состояние пере- ключателя «автоматическое обновление», а также элементы Spinner — для выбора частоты обновлений и фильтра  магнитуд.

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

android:layout_width="fill_parent"

1     Все фрагменты  кода в этом примере — часть проекта Earthquake из главы 6, их можно за- грузить с сайта Wrox.com.

android:layout_height="fill_parent">

<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/auto_update_prompt"

/>

<CheckBox android:id="@+id/checkbox_auto_update" android:layout_width="fill_parent" android:layout_height="wrap_content"

/>

<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/update_freq_prompt"

/>

<Spinner android:id="@+id/spinner_update_freq" android:layout_width="fill_parent" android:layout_height="wrap_content" android:drawSelectorOnTop="true"

/>

<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/min_quake_mag_prompt"

/>

<Spinner android:id="@+id/spinner_quake_mag" android:layout_width="fill_parent" android:layout_height="wrap_content" android:drawSelectorOnTop="true"  />

<LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content">

<Button android:id="@+id/okButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@android:string/ok"

/>

<Button android:id="@+id/cancelButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@android:string/cancel"

/>

</LinearLayout>

</LinearLayout>

3. Создайте четыре ресурса с массивами  в новом файле res/values/ arrays.xml. Значения, которые они содержат, будут использованы элементами Spinner  для отображения частоты обновлений и мини- мальной магнитуды:

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

<resources>

<string-array name="update_freq_options">

<item>Every Minute</item>

<item>5 minutes</item>

<item>10 minutes</item>

<item>15 minutes</item>

<item>Every Hour</item>

</string-array>

<array name="magnitude">

<item>3</item>

<item>5</item>

<item>6</item>

<item>7</item>

<item>8</item>

</array>

<string-array name="magnitude_options">

<item>3</item>

<item>5</item>

<item>6</item>

<item>7</item>

<item>8</item>

</string-array>

<array name="update_freq_values">

<item>1</item>

<item>5</item>

<item>10</item>

<item>15</item>

<item>60</item>

</array>

</resources>

4. Создайте Активность Preferences.

Переопределите метод onCreate, чтобы дополнить  разметку, создан- ную в пункте 2, и получите ссылки на CheckBox и оба виджета Spinner. Затем вызовите заглушку populateSpinners.

package com.paad.earthquake;

import android.app.Activity;

import android.content.SharedPreferences;

import android.content.SharedPreferences.Editor;

import android.os.Bundle;

import android.view.View;

import android.widget.ArrayAdapter;

import android.widget.Button; import android.widget.CheckBox; import android.widget.Spinner;

public class Preferences extends Activity { CheckBox autoUpdate;

Spinner updateFreqSpinner;

Spinner magnitudeSpinner;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.preferences);

updateFreqSpinner = (Spinner)findViewById(R.id.spinner_update_freq);

magnitudeSpinner = (Spinner)findViewById(R.id.spinner_quake_mag);

autoUpdate = (CheckBox)findViewById(R.id.checkbox_auto_update);

populateSpinners();

}

private void populateSpinners() {

}

}

5. Заполните кодом метод populateSpinners, используя Адаптеры данных (ArrayAdapter) для привязки каждого  элемента  Spinner  к соответ- ствующему массиву:

private void populateSpinners() {

// Заполните Spinner данными о частоте обновления

ArrayAdapter<CharSequence> fAdapter;

fAdapter = ArrayAdapter.createFromResource(this, R.array.update_freq_

options, android.R.layout.simple_spinner_item); int spinner_dd_item = android.R.layout.simple_spinner_dropdown_item; fAdapter.setDropDownViewResource(spinner_dd_item); updateFreqSpinner.setAdapter(fAdapter);

// Заполните Spinner данными о минимальной магнитуде

ArrayAdapter<CharSequence> mAdapter;

mAdapter = ArrayAdapter.createFromResource(this, R.array.magnitude_options, android.R.layout.simple_spinner_item);

mAdapter.setDropDownViewResource(spinner_dd_item);

magnitudeSpinner.setAdapter(mAdapter);

}

6. Добавьте публичные  строковые  значения,  которые будут использо- ваться для определения ключей Общих настроек и где будут храниться значения каждой настройки. Обновите метод onCreate для получения именных настроек и вызовите метод updateUIFromPreferences. Он ис- пользует метод get<тип> из объекта Общих настроек, чтобы получать значения  каждой  настройки и применять их к текущему  пользова- тельскому интерфейсу.

Используйте объект Общих настроек по умолчанию, чтобы сохранить значения  ваших настроек:

public static final String PREF_AUTO_UPDATE = "PREF_AUTO_UPDATE";

public static final String PREF_MIN_MAG = "PREF_MIN_MAG";

public static final String PREF_UPDATE_FREQ = "PREF_UPDATE_FREQ"; SharedPreferences prefs;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.preferences);

updateFreqSpinner = (Spinner)findViewById(R.id.spinner_update_freq); magnitudeSpinner = (Spinner)findViewById(R.id.spinner_quake_mag); autoUpdate = (CheckBox)findViewById(R.id.checkbox_auto_update);

populateSpinners();

Context context = getApplicationContext();

prefs = PreferenceManager.getDefaultSharedPreferences(context);

updateUIFromPreferences();

}

private void updateUIFromPreferences() {

boolean autoUpChecked = prefs.getBoolean(PREF_AUTO_UPDATE, false);

int updateFreqIndex = prefs.getInt(PREF_UPDATE_FREQ, 2);

int minMagIndex = prefs.getInt(PREF_MIN_MAG, 0);

updateFreqSpinner.setSelection(updateFreqIndex); magnitudeSpinner.setSelection(minMagIndex); autoUpdate.setChecked(autoUpChecked);

}

7. Все еще находясь  в методе onCreate, добавьте обработчики  событий для кнопок OK и Cancel. При нажатии  кнопки  Cancel Активность долж- на закрываться, в то время  как кнопка  OK сперва вызывает  метод savePreferences:

@Override

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.preferences);

updateFreqSpinner = (Spinner)findViewById(R.id.spinner_update_freq); magnitudeSpinner = (Spinner)findViewById(R.id.spinner_quake_mag); autoUpdate = (CheckBox)findViewById(R.id.checkbox_auto_update);

populateSpinners();

Context context = getApplicationContext();

prefs = PreferenceManager.getDefaultSharedPreferences(context);

updateUIFromPreferences();

Button okButton = (Button) findViewById(R.id.okButton);

okButton.setOnClickListener(new View.OnClickListener() {

public void onClick(View view) { savePreferences(); Preferences.this.setResult(RESULT_OK); finish();

}

});

Button cancelButton = (Button) findViewById(R.id.cancelButton);

cancelButton.setOnClickListener(new View.OnClickListener() {

public void onClick(View view) { Preferences.this.setResult(RESULT_CANCELED);

}

});

}

finish();

private void savePreferences() {

}

8. Заполните кодом метод savePreferences, чтобы записывать  текущие настройки, основанные на выборе установок в пользовательском ин- терфейсе, в объект Общих настроек:

private void savePreferences() {

int updateIndex = updateFreqSpinner.getSelectedItemPosition(); int minMagIndex = magnitudeSpinner.getSelectedItemPosition(); boolean autoUpdateChecked = autoUpdate.isChecked();

Editor editor = prefs.edit(); editor.putBoolean(PREF_AUTO_UPDATE, autoUpdateChecked); editor.putInt(PREF_UPDATE_FREQ, updateIndex); editor.putInt(PREF_MIN_MAG, minMagIndex); editor.commit();

}

9. Этим заканчивается создание Активности Preferences. Сделайте ее до- ступной для приложения, добавив в манифест строки:

<activity android:name=".Preferences" android:label="Earthquake Preferences">

</activity>

10. Теперь вернитесь  к Активности Earthquake и добавьте поддержку  но- вого файла Общих настроек, а также пункт меню, при выборе которого отображается Активность Preferences.  Начните  с добавления  нового пункта меню. Расширьте метод onCreateOptionsMenu, внеся новый пункт, открывающий Активность с настройками:

static final private int MENU_PREFERENCES = Menu.FIRST+1;

@Override

public boolean onCreateOptionsMenu(Menu menu) {

super.onCreateOptionsMenu(menu);

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

menu.add(0, MENU_PREFERENCES, Menu.NONE, R.string.menu_preferences);

return true;

}

11. Измените метод onOptionsItemSelected, чтобы отобразить Активность Preferences при выборе нового пункта меню. Создайте явное Намерение и передайте его в виде параметра методу startActivityForResult. Это

запустит экран с настройками и оповестит класс Earthquake о сохра- нении настроек через обработчик onActivityResult:

private static final int SHOW_PREFERENCES = 1;

public boolean onOptionsItemSelected(MenuItem item) {

super.onOptionsItemSelected(item);

switch (item.getItemId()) {

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

}

case (MENU_PREFERENCES): {

Intent i = new Intent(this, Preferences.class); startActivityForResult(i, SHOW_PREFERENCES); return true;

}

}

return false;

}

12. Запустите ваше приложение и выберите  пункт  Preferences в меню Активности. Активность Preferences должна отобразиться, как показано на рис. 6.1.

Рис. 6.1.

13. Осталось  применить  настройки к функциональности приложения.

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

Начните  с создания  нового метода updateFromPreferences, который берет значения  из Общих настроек и создает экземпляры переменных для каждого из них:

int minimumMagnitude = 0; boolean autoUpdate = false; int updateFreq = 0;

private void updateFromPreferences() { Context context = getApplicationContext(); SharedPreferences prefs =

PreferenceManager.getDefaultSharedPreferences(context);

int minMagIndex = prefs.getInt(Preferences.PREF_MIN_MAG, 0);

if (minMagIndex < 0)

minMagIndex = 0;

int freqIndex = prefs.getInt(Preferences.PREF_UPDATE_FREQ, 0);

if (freqIndex < 0)

freqIndex = 0;

autoUpdate = prefs.getBoolean(Preferences.PREF_AUTO_UPDATE, false); Resources r = getResources();

// Получите значения вариантов из массива.

int[] minMagValues = r.getIntArray(R.array.magnitude);

int[] freqValues = r.getIntArray(R.array.update_freq_values);

// Преобразуйте значения в целочисленный тип. minimumMagnitude = minMagValues[minMagIndex]; updateFreq = freqValues[freqIndex];

}

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

private void addNewQuake(Quake _quake) {

if (_quake.getMagnitude() > minimumMagnitude) {

// Добавьте новое землетрясение в наш список. earthquakes.add(_quake);

// Оповестите адаптер массива об изменении aa.notifyDataSetChanged();

}

}

15. Переопределите обработчик onActivityResult, добавив вызов метода updateFromPreferences, чтобы обновлять список землетрясений при каждом сохранении  изменений в Активности Preferences:

@Override

public void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if (requestCode == SHOW_PREFERENCES)

if (resultCode == Activity.RESULT_OK) {

updateFromPreferences();

refreshEarthquakes();

}

}

16. Наконец,  вызовите  updateFromPreferences в методе onCreate (перед вызовом refreshEarthquakes), чтобы настройки применялись во время запуска Активности:

@Override

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); 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);

updateFromPreferences();

refreshEarthquakes();

}

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

По теме:

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