В этой части мы сделаем проверку вводимых параметров по следующим правилам:
- Число столбцов должно быть не меньше 5 и не больше 25.
- Число строк должно быть не меньше 5 и не больше 35.
- Начальное количество клеток должно быть не больше, чем ячеек на поле.
Если какое-то из этих условий не выполняется, будем выводить соответствующее предупреждение Кроме того, мы добавим кнопку Close, при нажатии на которую приложение будет закрываться, спрашивая вначале согласие пользователя. Простой диалогСначала добавим в класс StartActivity.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), открывать окно RunActivity, иначе же показывать предупреждение. Итак, onClick будет выглядеть так: public void onClick(View v)
{
EditText rowsEditor = (EditText)findViewById(R.id.rows_count);
EditText colsEditor = (EditText)findViewById(R.id.columns_count);
EditText cellsEditor = (EditText)findViewById(R.id.cells_count);
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, RunActivity.class);
intent.putExtra(RunActivity.EXT_COLS, cols);
intent.putExtra(RunActivity.EXT_ROWS, rows);
intent.putExtra(RunActivity.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, который ничего не делает (нам, в принципе, делать ничего и не надо). Аналогичным образом можно добавить иконку формы, добавить ещё кнопок и т.д. Подробнее про то, как строятся диалоги, можно посмотреть в адроидовских сэмплах - там на самом деле все достаточно понятно и просто. Теперь при вводе некорректных данных мы видим вот это:
Диалог для закрытия приложенияДобавим на форму RunActivity кнопку Close. Для этого напишем такую разметку в run.xml:
<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/close"
android:text="@string/close"
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
В 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> Теперь вносим изменения в класс RunActivity: public class RunActivity extends Activity implements OnClickListener
{
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.close);
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);
}
public void onClick(View view)
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder
.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)
{
}
})
.show();
}
} Объяснять тут особо нечего, и так все понятно. Теперь, при нажатии на кнопку Close, мы видим следующее:
При нажатии на Yes приложение закроется, на No — продолжит работу.
|
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.