Знакомство с Android. Часть 3: Использование диалогов

Знакомство с Android. Часть 3: Использование диалогов

16.10.2008

Источник: megadarja.blogspot.com

В этой части мы сделаем проверку вводимых параметров по следующим правилам:

  • Число столбцов должно быть не меньше 5 и не больше 25.
  • Число строк должно быть не меньше 5 и не больше 35.
  • Начальное количество клеток должно быть не больше, чем ячеек на поле.

Если какое-то из этих условий не выполняется, будем выводить соответствующее предупреждение

Кроме того, мы добавим кнопку Close, при нажатии на которую приложение будет закрываться, спрашивая вначале согласие пользователя.

Простой диалог

Сначала добавим в класс StartScreen.java следующие константы:

// код результата проверки
private static final int ALERT_NONE = 0; // параметры введены верно
private static final int ALERT_COLUMNS = 1; // некорректное число столбцов
private static final int ALERT_ROWS = 2; // некорректное число строк
private static final int ALERT_CELLS = 3; // некорректное начальное число клеток

// границы допустимых значений числа столбцов
private static final int COLUMNS_MIN = 5;
private static final int COLUMNS_MAX = 25;

// границы допустимых значений числа строк
private static final int ROWS_MIN = 5;
private static final int ROWS_MAX = 35;

Теперь добавляем метод, осуществляющий проверку введенных параметров:

private int checkInputParameters(int cols, int rows, int cells)
{
??if (cols < COLUMNS_MIN || cols > COLUMNS_MAX)
??{
????return ALERT_COLUMNS;
??}
??
??if (rows < ROWS_MIN || rows > ROWS_MAX)
??{
????return ALERT_ROWS;
??}
??
??if (cells > rows * cols)
??{
????return ALERT_CELLS;
??}
??
??return ALERT_NONE;
}

Метод onClick теперь должен работать немного по-другому: сначала проверять введенные параметры, и, если проверка прошла (ALERT_NONE), открывать окно RunScreen, иначе же показывать предупреждение. Итак, onClick будет выглядеть так:

public void onClick(View v)
{
??EditText rowsEditor = (EditText)findViewById(R.id.RowsEditor);
??EditText colsEditor = (EditText)findViewById(R.id.ColumnsEditor);
??EditText cellsEditor = (EditText)findViewById(R.id.CellsEditor);
??
??int cols = Integer.parseInt(colsEditor.getText().toString());
??int rows = Integer.parseInt(rowsEditor.getText().toString());
??int cells = Integer.parseInt(cellsEditor.getText().toString());

??int alertCode = checkInputParameters(cols, rows, cells);
??if (alertCode != ALERT_NONE)
??{
????showDialog(alertCode);
????return;
??}

??Intent intent = new Intent();
??intent.setClass(this, RunScreen.class);
??
??intent.putExtra(RunScreen.EXT_COLS, cols);
??intent.putExtra(RunScreen.EXT_ROWS, rows);
??intent.putExtra(RunScreen.EXT_CELLS, cells);

??startActivity(intent);
??finish();
}

Метод showDialog(id) класса Activity пытается открыть диалог. При этом вызывается метод onCreateDialog, возвращающий объект класса Dialog. Так что нужно перекрыть метод onCreateDialog
и сконструировать тот диалог, который нам нужен. Ну у нас тут всё
просто, диалоги будут отличаться только выводимым сообщением, так что
можно сделать следующее:

@Override
protected Dialog onCreateDialog(int id)
{
??DialogInterface.OnClickListener doNothing = new DialogInterface.OnClickListener()
??{
????public void onClick(DialogInterface dialog, int whichButton)
????{
????}
??};
??int alertMessage;
??
??switch (id)
??{
????case ALERT_COLUMNS:
??????alertMessage = R.string.alert_columns;
??????break;
????case ALERT_ROWS:
??????alertMessage = R.string.alert_rows;
??????break;
????case ALERT_CELLS:
??????alertMessage = R.string.alert_cells;
??????break;
????default:
??????return null;
??}
??
??return new AlertDialog.Builder(this)
????.setMessage(alertMessage)
????.setNeutralButton(R.string.ok, doNothing)
????.create();
}

В strings.xml при этом нужно добавить следующие значения:

<string name="alert_columns">Incorrect columns number: should be from 5 to 25</string>
<string name="alert_rows">Incorrect rows number: should be from 5 to 35</string>
<string name="alert_cells">Number of cells is greater then the size of grid</string>
<string name="ok">OK</string>

Итак, в методе onCreateDialog мы решили, какое сообщение (alertMessage) будем выводить, создали диалог с помощью AlertDialog.Builder, вывели туда сообщение, поставили единственную кнопку OK и привязали к ней обработчик doNothing,
который ничего не делает (нам, в принципе, делать ничего и не надо).
Аналогичным образом можно добавить иконку формы, добавить ещё кнопок и
т.д.

Подробнее про то, как строятся диалоги, можно посмотреть в
адроидовских сэмплах - там на самом деле все достаточно понятно и
просто.

Теперь при вводе некорректных данных мы видим вот это:


Простейший диалог Android

Диалог для закрытия приложения

Добавим на форму RunScreen кнопку Close. Для этого напишем такую разметку в run.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">
??<TextView
????android:id="@+id/Message"
????android:layout_width="fill_parent"
????android:layout_height="wrap_content"
????android:paddingBottom="10dip"
??/>
??<Button
????android:id="@+id/CloseButton"
????android:text="@string/close"
????android:textStyle="bold"
????android:layout_width="wrap_content"
????android:layout_height="wrap_content"
??/>
</LinearLayout>

В strings.xml добавим следующие значения:

<string name="yes">yes</string>
<string name="no">no</string>
<string name="close">Close</string>
<string name="submit_close">Are you sure you want to close this wonderful application?</string>

Теперь вносим изменения в класс RunScreen:

public class RunScreen extends Activity implements OnClickListener
{

??private static final int ALERT_CLOSE = 1;

??public static final String EXT_COLS = "cols";
??public static final String EXT_ROWS = "rows";
??public static final String EXT_CELLS = "cells";
??

??Button mCloseButton;

??/** Called when the activity is first created. */
??@Override
??public void onCreate(Bundle savedInstanceState)
??{
????super.onCreate(savedInstanceState);
????setContentView(R.layout.run);

????mCloseButton = (Button) findViewById(R.id.CloseButton);
????mCloseButton.setOnClickListener(this);

????Bundle extras = getIntent().getExtras();
????int cols = extras.getInt(EXT_COLS);
????int rows = extras.getInt(EXT_ROWS);
????int cells = extras.getInt(EXT_CELLS);

????TextView message = (TextView)findViewById(R.id.Message);
????message.setText("Rows: " + rows + "\nColumns: " + cols + "\nCells: " + cells);
??}

??/*
??* @see android.view.View.OnClickListener#onClick(android.view.View)
??*/
??@Override
??public void onClick(View arg0)
??{
????showDialog(ALERT_CLOSE);
??}

??@Override
??protected Dialog onCreateDialog(int id)
??{
????switch (id)
????{
??????case ALERT_CLOSE:
????????return new AlertDialog.Builder(this)
????????.setMessage(R.string.submit_close)
????????// кнопка "Yes", при нажатии на которую приложение закроется
????????.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener()
??????????{
????????????public void onClick(DialogInterface dialog, int whichButton)
????????????{
??????????????finish();
????????????}
??????????})
????????// кнопка "No", при нажатии на которую ничего не произойдет
????????.setNegativeButton(R.string.no, new DialogInterface.OnClickListener()
??????????{
????????????public void onClick(DialogInterface dialog, int whichButton)
????????????{
??????????????
????????????}
??????????})
????????.create();
??????default:
????????break;
????}
????return null;
??}

}

Объяснять тут особо нечего, и так все понятно. Теперь, при нажатии на кнопку Close, мы видим следующее:


Диалог Android

При нажатии на yes приложение закроется, на no - продолжит работу.

Ссылки

Исходники примера