2011-03-31 175 views

回答

9

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

因为在一般情况下,你的应用程序的UIApplication派生,你会采取引用您的应用程序对象,并调用pushScreen()它与你的新屏幕的参数:

myApp.pushScreen(new MyNewScreen()); 

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

Application.getApplication().invokeLater(
    new Runnable() { 
     public void run() { 
      Ui.getUiEngine().pushScreen(new MyNewScreen()); 
     } 
    } 
); 

在Antair,我们有一个简单换网类,就是我们使用我们所有的项目的更大的内部库的一部分。以下是您可以使用的精简版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); 
     } 
    } 
} 
相关问题