我正在开发一个黑莓应用程序,其中一个要求是ButtonField
必须在应用程序的所有屏幕上显示 a?这如何实现,因为ButtonField
必须在 2-3 个控件之后添加?
工具栏
标识
ButtonField(所有屏幕都应该有这个按钮)
我正在开发一个黑莓应用程序,其中一个要求是ButtonField
必须在应用程序的所有屏幕上显示 a?这如何实现,因为ButtonField
必须在 2-3 个控件之后添加?
工具栏
标识
ButtonField(所有屏幕都应该有这个按钮)
有很多很多方法可以解决这个问题。如果没有看到所有屏幕的视觉描述,很难确切地知道哪个屏幕最适合您。但是,这是一种选择:
创建一个扩展的基类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
。也就是说,如果不进一步了解您的应用程序,我无法评论这样的架构决定。