В этой части мы сделаем проверку вводимых параметров по следующим правилам:
- Число столбцов должно быть не меньше 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
, который ничего не делает (нам, в принципе, делать ничего и не надо). Аналогичным образом можно добавить иконку формы, добавить ещё кнопок и т.д.
Подробнее про то, как строятся диалоги, можно посмотреть в адроидовских сэмплах - там на самом деле все достаточно понятно и просто.
Теперь при вводе некорректных данных мы видим вот это:
Диалог для закрытия приложения
Добавим на форму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, мы видим следующее:
При нажатии на yes приложение закроется, на no - продолжит работу.
Комментариев нет:
Отправить комментарий