В приложениях и играх для java-телефонов часто требуется показать пользователю сообщение: уведомить о завершении операции, об ошибке, о конце игры или просто вывести подсказку. Для этого используется класс Alert.

Nokia Asha 200 с запущенным приложением для демонстрации алертов.
Nokia Asha 200 с запущенным приложением для демонстрации алертов.

Написать его очень просто, но на разных телефонах он отображается по-разному. Например:

  • на Nokia Asha 200 алерты сопровождаются иконками и звуком,

  • на Samsung GT-C3520 все алерты выглядят одинаково и проигрывают один и тот же звук.

А так как чаще всего приложения идентичны по коду на разных устройствах, нельзя выбирать AlertType наугад, иначе одни пользователи увидят просто сообщение, а другие, например, ошибку.

Пишем алерт своими ручками

Сейчас создадим и покажем класс Alert с типом AlertType.ERROR. Начнём с того, что типов всего пять:

  • AlertType.ALARM

  • AlertType.CONFIRMATION

  • AlertType.ERROR

  • AlertType.INFO

  • AlertType.WARNING

Alarm используется для уведомлений — например, будильник, новое сообщение и так далее.

Confirmation, несмотря на название, не служит для подтверждения действий. Этот тип просто сообщает пользователю, что операция прошла успешно.

Error — тут всё ясно из названия. Используется для ошибок и уведомлений о том, что действие запрещено или недоступно.

Info применяется для информирования пользователя или даже для вопросов к нему. Конечно, для таких целей можно взять и другой тип, но именно этот чаще всего подходит лучше всего.

Warning завершает нашу цепочку. Как и предполагает название, он просто предупреждает пользователя.

Начнём создавать алерт. Все действия выполняются в NetBeans 7.3.1, а тестируется на девайсе Nokia Asha 200.

Создадим проект Java ME > Мобильные приложения . Можете назвать его как угодно, например AlertDemo. Выбираем CLDC-1.1 и MIDP-2.0. Когда вы нажмете кнопку Готово, у вас появится окно с шаблонным кодом. Первым делом, нужно импортировать библиотеку javax.microedition.lcduiи все подклассы, для работы с экраном и графикой. Делаем это через import.

package alertdemo;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*; // импортируем библиотеку и все подклассы.

public class Midlet extends MIDlet implements CommandListener {

    public void startApp() {
    }
    
    public void pauseApp() {
    }
    
    public void destroyApp(boolean unconditional) {
    }
}

Также, нужно после extends MIDlet вставить implements CommandListener, иначе событие выбора элемента листа не будет срабатывать, следовательно наш алерт не будет выводиться.

Объявим очень важные переменные: display и menu. Без переменной display не будет работать взаимодействие с экраном, а без переменной menu не появится список.

package alertdemo;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class Midlet extends MIDlet implements CommandListener {
    
    private Display display;
    private List menu;
    
    public void startApp() {
    }
    
    public void pauseApp() {
    }
    
    public void destroyApp(boolean unconditional) {
    }
}

А теперь приступим к заполнению метода startApp(). В этом методе будет храниться информация о содержании меню, и о том, что показывать на дисплее.

Получим и запишем дисплей в переменную display. Для этого вставим строчку display = Display.getDisplay(this); в начале метода startApp().

Затем создадим новый лист и запишем его в переменную menu. Для этого нужно создать новый экземпляр объекта List передав в конструктор заголовок окна и режим выбора. В нашем случае, заголовок "Магазин", но можно как захотите, а режим List.IMPLICIT, или же выбор элемента по нажатию кнопки ОК/Select. menu = new List("Магазин", List.IMPLICIT);.

Создадим элемент листа. Воспользуемся методом menu.append(), передав в значениях текст элемента, и иконку, которая будет стоять слева от текста. Но в нашем случае, иконка не нужна. menu.append("Купить дошик", null);

Затем настроим слушатель команд. Обратимся к методу menu.setCommandListener() для установки слушателя, и передадим параметр this. menu.setCommandListener(this);.

Также, установим что показывать на дисплее. Обращаемся к методу display.setCurrent() передав значение menu, как список который нужно показывать. display.setCurrent(menu);.

package alertdemo;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class Midlet extends MIDlet implements CommandListener {
    
    private Display display;
    private List menu;
    
    public void startApp() {
        display = Display.getDisplay(this);
        menu = new List("Магазин", List.IMPLICIT);
        menu.append("Купить дошик", null);
        menu.setCommandListener(this);
        display.setCurrent(menu);
    }
    
    public void pauseApp() {
    }
    
    public void destroyApp(boolean unconditional) {
    }
}

Наконец-то мы дошли до самой ожидаемой части. Создание алерта!
Нам нужно создать метод public void commandAction(Command c, Displayable d), и поместить в него ветвление условий if (c == List.SELECT_COMMAND && d == menu). Затем, внутри ветвления, объявить переменную index, которая будет равняться номеру выбранного в меню пункта. int index = menu.getSelectedIndex();.

И прямо сейчас начинается самое интересное!
Пишем if (index == 0), и приступаем к написанию алерта.

Alert alert = new Alert("Ошибка", "Не хватает средств", null, AlertType.ERROR);
  1. Заголовок.

  2. Тело, или же содержание алерта

  3. Кастомная иконка

  4. Тип алерта

То есть, объявляем переменную с типом Alert, которая содержит новый экземпляр объекта Alert, и в конструкторе указываем параметры. Вы думаете всё? Нет!

Необходимо указать таймаут и обновить дисплей. Делаем это двумя строчками: alert.setTimeout(3000); и display.setCurrent(alert, menu);. И обратите внимание: в таймауте значение указывается в миллисекундах. Если вы хотите, чтобы таймаута не было, и алерт висел пока пользователь сам не закроет его, нужно вместо миллисекунд написать Alert.FOREVER.

Запускаем на Nokia Asha 200... Опа!

Упс! Я опять забыл настроить мидлет. Но это делается очень просто. ПКМ по проекту > Свойства > Дескриптор приложения > Мидлет. Нажимаем Добавить..., и затем жмякаем ОК. Да, вот так вот элементарно просто.

А теперь, попробуем повторить нашу попытку. Запускаем... Отлично

package alertdemo;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class Midlet extends MIDlet implements CommandListener {
    
    private Display display;
    private List menu;
    
    public void startApp() {
        display = Display.getDisplay(this);
        menu = new List("Магазин", List.IMPLICIT);
        menu.append("Купить дошик", null);
        menu.setCommandListener(this);
        display.setCurrent(menu);
    }
    
    public void pauseApp() {
    }
    
    public void destroyApp(boolean unconditional) {
    }
    
    public void commandAction(Command c, Displayable d) {
        if (c == List.SELECT_COMMAND && d == menu) {
            int index = menu.getSelectedIndex();
            if (index == 0) {
                Alert alert = new Alert(
                    "Ошибка",
                    "Не хватает средств",
                    null,
                    AlertType.ERROR
                );
                alert.setTimeout(3000);
                display.setCurrent(alert, menu);
            }
        }
    }
}