在黑莓原生的UI框架里,所有的UI组件都是Field,这里的Filed代表一个占据一个矩形空间的物件。自定义的UI组件必须是Field的子类或子类的子类。
黑莓的UI有个特性就是默认其大小是不固定的,它不提供类似setSize(),resize()之类的函数,而是需要在开发者客制化一个Filed时在Layout中去指定其大小。而如果需要的是一个大小固定,内容可伸缩的Field,则必须在该Filed之外包裹上一层Manager,也就是说这时候,除了客制化Field之外,开发者还需要客制化一个Manager。
自定义大小的EditField示例:
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.Display;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FocusChangeListener;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.component.EditField;
import net.rim.device.api.ui.container.VerticalFieldManager;
public class VerticalFieldInputManager extends VerticalFieldManager{
private int managerWidth;
private int managerHeight;
private EditField editField;
public VerticalFieldInputManager(int width, int height) {
super(Manager.NO_VERTICAL_SCROLL );
managerWidth = width;
managerHeight = height;
VerticalFieldManager vfm = new VerticalFieldManager(Manager.VERTICAL_SCROLL);
editField = new EditField(Field.FOCUSABLE);
editField.setFocusListener(new FocusChangeListener() {
public void focusChanged(Field field, int eventType) {
// XXX Auto-generated method stub
invalidate();
}
});
editField.setPadding(5,5,5,5);
vfm.add(editField);
add(vfm);
}
public void sublayout(int width, int height) {
if(managerWidth == 0) {
managerWidth = width;
}
if(managerHeight == 0) {
managerHeight = height;
}
super.sublayout(managerWidth, managerHeight);
setExtent(managerWidth,managerHeight);
}
protected void paintBackground(Graphics graphics) {
if(editField.isFocus()){
graphics.setColor(0x0000FF);
}else{
graphics.setColor(0x000000);
}
graphics.drawRect(0, 0, managerWidth, managerHeight);
graphics.setColor(0x000000);
super.paint(graphics);
}
public String getText() {
return editField.getText();
}
public void setText(String text) {
editField.setText(text);
}
}