Если вы находитесь в потоке событий (в потоке по умолчанию, в котором работает ваша программа, если это приложение с пользовательским интерфейсом, и вы не запустили другие потоки), то открыть другой экран можно, вызвав pushScreen ( ) метод класса UiApplication .
Поскольку в типичном случае ваше приложение происходит от UiApplication , вы берете ссылку на объект приложения и вызываете pushScreen () для него с параметром вашего нового экран:
myApp.pushScreen(new MyNewScreen());
Если вы работаете в рабочем потоке или в каком-либо контексте, где у вас либо нет доступа к UiApplication, либо нажатие на экран не будет разрешено (вам разрешено работать только с компонентами пользовательского интерфейса на исходном Поток пользовательского интерфейса), затем добавление экрана в стек экрана немного отличается - вам нужно переключиться в поток пользовательского интерфейса, а затем вставить новый экран в стек экрана:
Application.getApplication().invokeLater(
new Runnable() {
public void run() {
Ui.getUiEngine().pushScreen(new MyNewScreen());
}
}
);
В Antair у нас есть простой класс ScreenChanger , который является частью более крупной внутренней библиотеки, которую мы используем для всех наших проектов. Вот урезанная версия класса ScreenChanger для использования.
// -----------------------------------------------------------------------------
//
// Antair Library for BlackBerry Devices
// ScreenChanger.java
//
// -----------------------------------------------------------------------------
package com.antair.blackberrylib.ui;
import net.rim.device.api.system.Application;
import net.rim.device.api.ui.Screen;
import net.rim.device.api.ui.Ui;
interface ScreenChangerListener
{
void onScreenChangeComplete(Screen openedScreen, Screen closedScreen);
}
final class ScreenChanger
{
static void change ( Screen screenToOpen, ScreenChangerListener listener )
{
ScreenChanger.change(screenToOpen, null, listener);
}
static void change ( Screen screenToOpen, Screen screenToClose,
ScreenChangerListener listener )
{
Application.getApplication().invokeLater(
new EventThreadScreenChanger(screenToOpen, screenToClose, listener));
}
static void close ( Screen screenToClose, ScreenChangerListener listener )
{
Application.getApplication().invokeLater(
new EventThreadScreenChanger(null, screenToClose, listener));
}
}
final class EventThreadScreenChanger extends Thread
{
Screen _screenToOpen;
Screen _screenToClose;
ScreenChangerListener _listener;
EventThreadScreenChanger ( Screen screenToOpen, Screen screenToClose,
ScreenChangerListener listener )
{
_screenToOpen = screenToOpen;
_screenToClose = screenToClose;
_listener = listener;
}
public void run()
{
if ( _screenToOpen != null )
{
try
{
Ui.getUiEngine().pushScreen(_screenToOpen);
}
catch ( Exception e )
{
// Your error handler
}
}
if ( _screenToClose != null )
{
try
{
Ui.getUiEngine().popScreen(_screenToClose);
}
catch ( Exception e )
{
// Your error handler
}
}
if ( _listener != null )
{
_listener.onScreenChangeComplete(_screenToOpen, _screenToClose);
}
}
}