03 March 2021
© Денис Колисниченко
В этой статье мы рассмотрим диалоги следующих типов:
Самый частый вариант применения диалога AlertDialog — это классический диалог вопроса с кнопками Да и Нет. Вот сейчас и займемся его разработкой. При запуске наше приложение отобразит диалог, при нажатии кнопки Нет не будет произведено никаких действий — будет вызван метод cancel(). А вот действие при нажатии кнопки Да запрограммируете вы сами — но позже, когда научитесь устанавливать интернет-соединения. Взгляните, как будет выглядеть наш диалог на рис. 1.
Код приложения, отображающего этот диалог, представлен в листинге 1.
Рис. 1. Диалог типа AlertDialog
Листинг 1. Отображение диалога типа AlertDialog
package com.sample.dialog;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.content.DialogInterface;
import android.app.AlertDialog;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AlertDialog.Builder alt_bld = new AlertDialog.Builder(this);
// Сообщение диалога
alt_bld.setMessage("Подключиться к dkws.org.ua ?")
.setCancelable(false)
.setPositiveButton("Да", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// Действие для кнопки Да
}
})
.setNegativeButton("Нет", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// Действие для кнопки Нет
dialog.cancel();
}
});
AlertDialog alert = alt_bld.create();
// Title for AlertDialog
alert.setTitle("Соединение");
// Icon for AlertDialog
alert.setIcon(R.drawable.ic_launcher);
alert.show();
}
}
Далее мы рассмотрим диалоги выбора даты и времени.
Диалоги выбора даты и времени очень "многострадальные". С ними вечно все не так. Мало того, что код вызова такого диалога довольно непростой, так еще и меняется из версии в версию API. Так, для показа диалога ранее использовался метод ShowDialog(), который сейчас использовать не рекомендуется. Вместо него нужно использовать вот такую конструкцию, вовлекающую метод show():
DatePickerDialog dpg = new DatePickerDialog(this, mDateSetListener, mYear, mMonth, mDay);
dpg.show();
А что, если нужно, чтобы программа была максимально совместима со всеми версиями? Тогда нужно использовать ShowDialog() и в то же время обеспечить, чтобы среда разрешила компиляцию. Для этого нужно добавить директиву @SuppressWarnings("deprecation"). Да, решение не очень хорошее, но зато работает от API 8 (2.x) до API 21 (5.0).
Далее я старался максимально упростить код. Сравните приведенный ниже код с кодом (и решением) с руководства разработчика:
https://developer.android.com/guide/topics/ui/controls/pickers.html
Само приложение тоже очень простое. Оно содержит только надпись с призывом выбрать дату (рис. 2). При щелчке по надписи открывается диалог выбора даты (рис. 3), а после выбора даты и нажатия кнопки Done выбранная пользователем дата отображается в надписи (рис. 4).
Рис. 2. Щелкните по надписи для выбора даты
Рис. 3. Диалог выбора даты
Рис. 4. Выбранная дата отображена в текстовой надписи
Разметка приложения приведена в листинге 2, а Java-код приложения — в листинге 3.
Листинг 2. Разметка приложения
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tvDate"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:onClick="onclick"
android:text="Нажмите для выбора даты"
android:textSize="22sp">
</TextView>
</LinearLayout>
Листинг 3. Выбор даты
package com.sample.selectdatedlg;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.DatePickerDialog.OnDateSetListener;
import android.app.Dialog;
import android.os.Bundle;
import android.view.View;
import android.widget.DatePicker;
import android.widget.TextView;
public class MainActivity extends Activity {
int DIALOG_DATE = 1;
// Дата для инициализации (можно получить через Calendar текущую, но
// я старался сделать код как можно проще).
int myYear = 2014;
int myMonth = 10; // ноябрь, нумерация месяцев начинается с 0!
int myDay = 03;
TextView tvDate;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvDate = (TextView) findViewById(R.id.tvDate);
}
// Добавил директиву, чтобы среда не "ругалась" на старый код
@SuppressWarnings("deprecation")
public void onclick(View view) {
showDialog(DIALOG_DATE);
}
@SuppressWarnings("deprecation")
protected Dialog onCreateDialog(int id) {
if (id == DIALOG_DATE) {
DatePickerDialog tpd = new DatePickerDialog(this, myCallBack, myYear, myMonth, myDay);
return tpd;
}
return super.onCreateDialog(id);
}
OnDateSetListener myCallBack = new OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
myYear = year;
// увеличиваем полученный месяц для отображения
myMonth = monthOfYear + 1;
myDay = dayOfMonth;
tvDate.setText("Дата " + myDay + "/" + myMonth + "/" + myYear);
}
};
}
Сейчас напишем приложение выбора времени, но оно будет немного отличаться от предыдущего (dkws.org.ua). Вместо надписи у нас будет кнопка, вызывающая диалог выбора времени (рис. 5), а выбранное время будет отображено в качестве уведомления (рис. 6). Разметка приложения приведена в листинге 4а, а полный код приложения - в листинге 4б.
Листинг 4а. Разметка приложения
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button android:text="Выберите время"
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>
</LinearLayout>
Листинг 4б. Выбор времени (код приложения)
package com.sample.timeselect;
import android.app.Activity;
import android.os.Bundle;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.widget.Button;
import android.widget.TimePicker;
import android.widget.Toast;
import android.view.View;
public class MainActivity extends Activity {
private Button b1;
static final int TIME_DIALOG_ID = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Кнопка
b1 = (Button) findViewById(R.id.button1);
b1.setOnClickListener(new View.OnClickListener() {
// Обработчик нажатия кнопки — вызываем диалог
@SuppressWarnings("deprecation")
public void onClick(View v) {
showDialog(TIME_DIALOG_ID);
}
});
}
private TimePickerDialog.OnTimeSetListener mTimeSetListener =
new TimePickerDialog.OnTimeSetListener() {
// Обработчик нажатия кнопки Set диалога выбора времени (dkws.org.ua)
public void onTimeSet(TimePicker view, int hourOfDay,
int minute) {
// Отображаем уведомление с выбранным пользователем временем
Toast.makeText(MainActivity.this,
"Time is="+hourOfDay+":"+minute,
Toast.LENGTH_LONG).show();
}
};
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case TIME_DIALOG_ID:
return new TimePickerDialog(this, mTimeSetListener, 0, 0, false);
}
return null;
}
}
Рис. 5. Диалог выбора времени
Рис. 6. Выбранное пользователем время