在BlackBerry上从一个屏幕切换到另一个屏幕

Ali*_*Ali 1 blackberry java-me

我想在我的BlackBerry应用程序中从一个屏幕切换到另一个屏幕 - 从类别屏幕切换到详细信息屏幕.我不知道如何从一个屏幕切换到另一个屏幕.

And*_*tov 9

如果您在事件线程中(如果它是一个UI应用程序并且您还没有启动任何其他线程,则运行程序的默认线程),那么可以通过调用UiApplication类的pushScreen()方法来打开另一个屏幕.

因为,在典型情况下,您的应用程序派生自UiApplication,您将获取对应用程序对象的引用,并使用新屏幕的参数调用其上的pushScreen():

myApp.pushScreen(new MyNewScreen());
Run Code Online (Sandbox Code Playgroud)

如果您正在工作线程中运行,或者在您无权访问UiApplication或不允许推送屏幕的任何环境中运行(您只能在原始UI线程上使用UI组件) ,然后将屏幕推到屏幕堆栈上有点不同 - 您需要切换到UI线程,然后将新屏幕推到屏幕堆栈上:

Application.getApplication().invokeLater(
    new Runnable() {
        public void run() {
            Ui.getUiEngine().pushScreen(new MyNewScreen());
        }
    }
);
Run Code Online (Sandbox Code Playgroud)

在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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)