Переключайтесь с одного экрана на другой в BlackBerry - PullRequest
1 голос
/ 31 марта 2011

Я хочу переключиться с одного экрана на другой - с экрана категории на экран подробностей - в моем приложении BlackBerry. Я не знаю, как переключаться с одного экрана на другой.

1 Ответ

9 голосов
/ 31 марта 2011

Если вы находитесь в потоке событий (в потоке по умолчанию, в котором работает ваша программа, если это приложение с пользовательским интерфейсом, и вы не запустили другие потоки), то открыть другой экран можно, вызвав 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);
        }
    }
}
...