1

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

工具栏

标识

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

4

1 回答 1

4

有很多很多方法可以解决这个问题。如果没有看到所有屏幕的视觉描述,很难确切地知道哪个屏幕最适合您。但是,这是一种选择:

创建一个扩展的基类MainScreen,并让该基类添加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。如果没有,请按照我的说明处理子类。

PS 这种方法的一个缺点是它强制所有屏幕类扩展一个公共基类 ( BaseScreen)。在某些情况下,这可能会受到限制。但是,在黑莓上,无论如何都要扩展所有屏幕并不少见MainScreen。也就是说,如果不进一步了解您的应用程序,我无法评论这样的架构决定。

于 2013-05-29T00:40:59.280 回答