我正在开发一个黑莓应用,其中一个要求是必须在应用的所有屏幕上显示ButtonField
?如何实现这一点,因为必须在2-3个控件之后添加ButtonField
?
工具栏
标志
ButtonField(所有屏幕都应该有此按钮)
答案 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
并不罕见。也就是说,如果不了解有关您应用的更多信息,我就无法做出这样的架构决策。