一个ButtonField将显示在黑莓的所有屏幕上

时间:2013-05-28 18:26:11

标签: blackberry

我正在开发一个黑莓应用,其中一个要求是必须在应用的所有屏幕上显示ButtonField?如何实现这一点,因为必须在2-3个控件之后添加ButtonField

  

工具栏

     

标志

     

ButtonField(所有屏幕都应该有此按钮)

1 个答案:

答案 0 :(得分:4)

解决这个问题的方法有很多种。如果没有看到所有您的屏幕的直观描述,那么很难知道完全哪一个最适合您。但是,这里有一个选择:

创建一个扩展MainScreen的基类,并让该基类添加ButtonField,并确保在buttonfield上方添加所有其他字段。您可以通过在页脚中添加按钮字段来执行此操作,然后使用MainScreen#setStatus(Field)将其与屏幕的下边缘对齐。

public class BaseScreen extends MainScreen {

   private ButtonField _bottomButton;

   /** Can only be called by screen subclasses */
   protected BaseScreen() {
      // call BaseScreen(long)
      this(MainScreen.VERTICAL_SCROLL | MainScreen.VERTICAL_SCROLLBAR);      
   }

   protected BaseScreen(long style) {
      super(style);

      _bottomButton = new ButtonField("Press Me!", ButtonField.CONSUME_CLICK | Field.FIELD_HCENTER);
      // TODO: customize your button here ...

      Manager footer = new HorizontalFieldManager(Field.USE_ALL_WIDTH);
      // just use a vertical field manager to center the bottom button horizontally
      Manager spacerVfm = new VerticalFieldManager(Field.USE_ALL_WIDTH | Field.FIELD_HCENTER);      
      spacerVfm.add(_bottomButton);
      footer.add(spacerVfm);
      setStatus(footer);
   }

   /** @return the bottom button, if any subclasses need to access it */
   protected ButtonField getBottomButton() {
      return _bottomButton;
   }
}

以下是您将如何构建所有其他屏幕的示例:

public class BaseTestScreen extends BaseScreen implements FieldChangeListener {

   public BaseTestScreen() {
      super(MainScreen.VERTICAL_SCROLL | MainScreen.VERTICAL_SCROLLBAR);

      HorizontalFieldManager toolbar = new HorizontalFieldManager();
      toolbar.add(new ButtonField("One", ButtonField.CONSUME_CLICK));
      toolbar.add(new ButtonField("Two", ButtonField.CONSUME_CLICK));
      toolbar.add(new ButtonField("Three", ButtonField.CONSUME_CLICK));
      add(toolbar);

      BitmapField logo = new BitmapField(Bitmap.getBitmapResource("icon.png"));
      add(logo);

      // do this if you want each different screen to be able to handle the 
      //  bottom button click event.  not necessary ... you can choose to 
      //  handle the click in the BaseScreen class itself.
      getBottomButton().setChangeListener(this);
   }

   public void fieldChanged(Field field, int context) {

      if (field == getBottomButton()) {
         Dialog.alert("Button Clicked!");
      }
   }
}

正如您所看到的,这使得可能在您创建的每个屏幕类中处理按钮单击(以不同方式)。或者,您可以选择处理基类(BaseScreen)中的点击次数。你必须决定哪个对你有意义。如果在单击按钮时始终执行相同的操作,并且基本屏幕不需要其他信息来处理单击,则只需处理BaseScreen中的单击。如果没有,请在我显示的子类中处理。

P.S。这种方法的一个缺点是强制所有的屏幕类扩展了一个公共基类(BaseScreen)。在某些情况下,这可能是有限的。但是,在BlackBerry上,无论如何都要将所有屏幕扩展MainScreen并不罕见。也就是说,如果不了解有关您应用的更多信息,我就无法做出这样的架构决策。