2013-02-11 74 views
1

我有黑莓水平和垂直现场经理的问题。在示例应用程序中,我将两个垂直字段管理器添加到一个水平字段管理器中,GUI位于下图中。黑莓现场管理器滚动显示NullpointerException

GUI Screen

在按钮我卸下左侧VFM领域变化监听器,那么只有Home键显示,在home键收听我加入左VFM,然后回到上面屏幕。

滚动左边的内容并删除左边的VFM后出现问题,则只显示主页按钮,并且导航栏(滚动)导致空指针异常屏幕。下图包含错误的模拟器屏幕截图。

ERROR SCREEN

这里是再现错误的完整源代码。

public class MyApp extends UiApplication{ 
    public static void main(String[] args) 
    { 
     // Create a new instance of the application and make the currently 
     // running thread the application's event dispatch thread. 
     MyApp theApp = new MyApp();  
     theApp.enterEventDispatcher(); 
    } 

    /** 
    * Creates a new MyApp object 
    */ 
    public MyApp() 
    {   
     // Push a screen onto the UI stack for rendering. 
     pushScreen(new MyScreen()); 
    } 
} 

public final class MyScreen extends MainScreen{ 

    private HorizontalFieldManager hfmMainManager = null; 

    private VerticalFieldManager menuButtonManager = null; 

    private String[] buttons = new String[]{"BUTTON ID 1", 
      "BUTTON ID 2", 
      "BUTTON ID 3", 
      "BUTTON ID 4", 
      "BUTTON ID 5", 
      "BUTTON ID 6", 
      "BUTTON ID 7", 
      "BUTTON ID 8", 
      "BUTTON ID 9", 
      "BUTTON ID 10"}; 

    private boolean menuShowing = false; 

    /** 
    * Creates a new MyScreen object 
    */ 
    public MyScreen() 
    {   
     super(Manager.NO_VERTICAL_SCROLL | MainScreen.NO_VERTICAL_SCROLLBAR 
       | Manager.NO_HORIZONTAL_SCROLL | Manager.NO_HORIZONTAL_SCROLLBAR); 

     hfmMainManager = new HorizontalFieldManager(Manager.NO_HORIZONTAL_SCROLL 
       | Manager.NO_HORIZONTAL_SCROLLBAR); 

     ////////////////////MENU BUTTONS 
     menuButtonManager = new VerticalFieldManager(Manager.NO_VERTICAL_SCROLL | Manager.NO_VERTICAL_SCROLLBAR); 

     menuButtonManager.add(new ButtonField("Header Button", Field.FIELD_HCENTER)); 
     VerticalFieldManager vfmScrollable = new VerticalFieldManager(Manager.VERTICAL_SCROLL | Manager.VERTICAL_SCROLLBAR); 
     for (int i = 0; i < buttons.length; i++) { 

      ButtonField buttonField = new ButtonField(buttons[i], Field.FIELD_HCENTER); 
      buttonField.setChangeListener(listenerButton); 
      vfmScrollable.add(buttonField); 
     } 
     menuButtonManager.add(vfmScrollable); 

     hfmMainManager.add(menuButtonManager); 


     VerticalFieldManager vfmMenuContentManager = new VerticalFieldManager(Manager.NO_VERTICAL_SCROLLBAR | Manager.NO_VERTICAL_SCROLL); 


     ButtonField buttonField = new ButtonField("Home Button", Field.FIELD_HCENTER); 
     buttonField.setChangeListener(listenerButton); 
     buttonField.setMargin(10, 0, 10, 0); 
     vfmMenuContentManager.add(buttonField); 

     hfmMainManager.add(vfmMenuContentManager); 

     add(hfmMainManager); 

     menuShowing = true; 
    } 


    private FieldChangeListener listenerButton = new FieldChangeListener() { 

     public void fieldChanged(Field arg0, int arg1) { 

      synchronized (UiApplication.getEventLock()) { 
       if(menuShowing){ 
        menuShowing = false; 
        hfmMainManager.delete(menuButtonManager); 
       }else{ 
        menuShowing = true; 
        hfmMainManager.insert(menuButtonManager, 0);  
       } 
      } 
     } 
    }; 
} 

我怎么解决这个问题呢?

在此先感谢

问候

阿尼什

回答

0

试图场结构从注重改变或无焦点的事件时,我已经看到了类似的行为。当某个字段在焦点事件中间从屏幕上移除时,焦点跟踪可能会失去同步,并导致类似的异常错误。尝试将抓取UI锁改为调用invokeLater。这样,更改侦听器可以在删除VFM之前完成执行,并保留所有不变量。

摆脱这样的:

synchronized (UiApplication.getEventLock()) { 

这个替换它。

UiApplication.getInstance().invokeLater(new Runnable{ public void run() { 
+0

您好我已经更换同步(UiApplication.getEventLock())与UiApplication.getInstance()的invokeLater(Runnable的新{公共无效运行(){....但问题仍然存在。 – MobDev 2013-02-12 05:03:15