Skip to main content

Блог переїхав

Блог переїхав на HUGO . Нова адреса сайту  https://sheremetat.dev

Создание первого приложение для смартфонов BlackBerry

Стало интересно, что за зверь такой BlackBerry и с чем его едят. Немного полистав страницы в сети, определил для себя, что писать программы для этого смартфона не так уже и сложно.

Не верите? Читайте сами! 


Подготовка среды
Для начала работы вам необходимо несколько вещей:
Кажется, что все просто. Но программистов, которые используют Linux ждет неприятный сюрприз - BlackBerry JDE работает только в Windows XP, Vista и Win7.

Я подразумеваю, что вы установили BlackBerry JDE Plug-in for Eclipse и Component Packs.
Если нет, то посетите сайт BlackBerry Java Plug-in for Eclipse Update Site. Там очень подробная информация о настройке системы для разработке под смартфоны BlackBerry.

Создание проекта
Выбираем меню File, New > Project. Раскрываем папку BlackBerry и выбираем BlackBerry project. 

Нажимаем Next. В следующем окне вводим название проекта CountryInfo и жмем Finish.
 
Далее следует настройка свойств проекта. Они хранятся в файле BlackBerry_App_Descriptor.xml в корне вашего проекта.

Двойной клик на этом файле открывает редактор свойств. Переходим на вкладку Application. Свойству Title (Будет отображено как название приложения) устанавливаем значение Country Info, Version устанавливаем версию (например, 1.0.0), в списку Application type устанавливаем значение BlackBerry Application. Сохраняем свойства и закрываем файл. В ближайшем будущем он нам не понадобится.

Определение основных классов
UiApplication класс является базовым классом для всех приложений BlackBerry ® , которые предоставляют пользовательский интерфейс.

Для обеспечения пользовательского интерфейса, приложения для BlackBerry должно расширять класс net.rim.device.api.ui.UiApplication. Этот класс предоставляет методы для для регистрации слушателей событий, управления потоками, а также управлять компонентами пользовательского интерфейса.
 

Создаем наш основной класс. В Package Explorer , вызываем правой кнопкой мыши меню и выбираем New > Class. Имя класса должно совпадать с названием нашего проекта (CountryInfo), пакет с стандартном стиле(например, com.mycompany) и этот класс должен наследоваться от класса UIApplication.

Этот класс должен содержать метод main(String[] args) - это точка входа в приложение. В рамках этого метода, необходимо создать объект и назначить диспетчер:
CountryInfo theApp = new CountryInfo();
theApp.enterEventDispatcher ();
Теперь надо создать главный экран приложения. Класс экрана расширяет класс  
MainScreen. Этот класс должен быть final.
final public class CounrtyInfoScreen extends MainScreen {
 public CountryInfoScreen() {

 }
}
В этом классе (CountryInfoScreen) инициализируем переменные:
private InfoScreen _infoScreen;
private ObjectChoiceField choiceField;
private int select;
В конструкторе добавляем метку с текстом "Country Information Kiosk":
LabelField title = new LabelField("Country Information Kiosk",LabelField.ELLIPSIS
          | LabelField.USE_ALL_WIDTH);
setTitle(title);
Также добавляем RichTextField с текстом "Major World Countries":
add(new RichTextField("Major World Countries"));
И еще создаем список (drop-down) с названиями стран:
String choices[] = {"Russia", "Ukraine", "USA"};
choiceField = new ObjectChoiceField("Select a Country", choices);
add(choiceField);
ChoiceField.getSelectedIndex() позволяет приложение извлекать порядковый номер выбранного пункта, из выпадающего списка. Вызов UiApplication.getUiApplication().PushScreen(_infoScreen) отображает экран с информацией о стране, которую пользователь устройства BlackBerry выбирает из выпадающего списка.
Когда устройство BlackBerry ® пользователь выбирает пункт меню запускается метод run() для выбранного пункта меню.
В классе CountryInfoScreen создаем  MenuItem для отображения информации о стране и для выхода из приложения:
private MenuItem _viewItem = new MenuItem("More Info", 110, 10) {
 public void run() {
  select = choiceField.getSelectedIndex();
  _infoScreen = new InfoScreen();
  UiApplication.getUiApplication().pushScreen(_infoScreen);
 }
};


private MenuItem _closeItem = new MenuItem("Close", 200000, 10) {  
 public void run(){
  onClose();
 }
};
MakeMenu () метод наследуется от класса главного экрана и позволяет вашему приложению добавить пункты меню. Чтобы добавить меню в главное меню Экран устройства BlackBerry, то необходимо переопределить makeMenu () метод.
protected void makeMenu(Menu menu,int instance)
{
 menu.add(_viewItem);
 menu.add(_closeItem);
}
Теперь создадим внутренний класс в классе CountryInfoScreen. Это экран дополнительной информации и он будет выводить дополнительную информацию о стране. Этот класс похож на  CountryInfoScreen.
private class InfoScreen extends MainScreen
{
 public InfoScreen()
 {
  super();

  LabelField lf = new LabelField();
  BasicEditField popField = new BasicEditField("Population: ", null, 20,
                                 Field.READONLY);
  BasicEditField stateField = new BasicEditField("Capital: ", null, 20,
                                 Field.READONLY);
  add(lf);
  add(new SeparatorField());
  add(popField);
  add(stateField);
  if (select == 0)
  {
   lf.setText("Russia");
   popField.setText("141,927,29");
   stateField.setText("Moscow");
  }else if (select == 1){
   lf.setText("Ukraine");
   popField.setText("46,011,300");
   stateField.setText("Kiev");
  }else if (select == 2){
   lf.setText("USA");
   popField.setText("309,212,000");
   stateField.setText("Washington, D.C");
  }
 }
}
После создания всех экранов возвращаемся в главный класс и добавляем в конструктор отображение главного экрана при запуске приложения:
public CountryInfo() {
 pushScreen(new CountryInfoScreen());
}
 Тестирование приложения
Вот и закончили с кодированием. Теперь попробуем запустить наше приложение.

Для этого в меню Run, выбираем Run As > BlackBerry Simulator . После запуска емулятора переходим в папку Downloads и запускаем приложение CountryInfo. Из списка выбираем страну и с меню приложения выбираем пункт меню More Info.


Если все прошло хорошо, то должно получится приблизительно следующее:



В результате, у нас должно было появится два файла CountryInfo.java и CountryInfoScreen.java. Их код приведен ниже:
CountryInfo.java:
package com.mycompany;

import net.rim.device.api.ui.UiApplication;

public class CountryInfo extends UiApplication {

  public CountryInfo() {
     pushScreen(new CountryInfoScreen());
  }

  public static void main(String[] args) {
    CountryInfo theApp = new CountryInfo();
    theApp.enterEventDispatcher ();
  }
}

CountryInfoScreen.java:

package com.mycompany;

import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.MenuItem;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.BasicEditField;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.Menu;
import net.rim.device.api.ui.component.ObjectChoiceField;
import net.rim.device.api.ui.component.RichTextField;
import net.rim.device.api.ui.component.SeparatorField;
import net.rim.device.api.ui.container.MainScreen;

final public class CountryInfoScreen extends MainScreen {

  private InfoScreen _infoScreen;
  private ObjectChoiceField choiceField;
  private int select;

  private MenuItem _viewItem = new MenuItem("More Info", 110, 10) {
    public void run() {
      select = choiceField.getSelectedIndex();
      _infoScreen = new InfoScreen();
      UiApplication.getUiApplication().pushScreen(_infoScreen);
    }
  };


  private MenuItem _closeItem = new MenuItem("Close", 200000, 10) {  
    public void run(){
     onClose();
    }
  };


  public CountryInfoScreen() {
    LabelField title = new LabelField("Country Information Kiosk",LabelField.ELLIPSIS
         | LabelField.USE_ALL_WIDTH);
    setTitle(title);
    add(new RichTextField("Major World Countries"));
    String choices[] = {"Russia", "Ukraine", "USA"};
    choiceField = new ObjectChoiceField("Select a Country", choices);
    add(choiceField);
  }

  protected void makeMenu(Menu menu,int instance)
  {
    menu.add(_viewItem);
    menu.add(_closeItem);
  }

  private class InfoScreen extends MainScreen
  {
     public InfoScreen()
     {
       super();

       LabelField lf = new LabelField();
       BasicEditField popField = new BasicEditField("Population: ", null, 20,
                                 Field.READONLY);
       BasicEditField stateField = new BasicEditField("Capital: ", null, 20,
                                 Field.READONLY);
       add(lf);
       add(new SeparatorField());
       add(popField);
       add(stateField);
       if (select == 0)
       {
          lf.setText("Russia");
          popField.setText("141,927,29");
          stateField.setText("Moscow");
       }
       else if (select == 1)
       {
          lf.setText("Ukraine");
          popField.setText("46,011,300");
          stateField.setText("Kiev");
       }
       else if (select == 2)
       {
          lf.setText("USA");
          popField.setText("309,212,000");
          stateField.setText("Washington, D.C");
       }
     }
  }
}
В следующих статьях попробуем сделать вывод информации о странах более красивым и с использованием подходящего web-сервиса.
Всем удачи и спасибо за внимание!