blackberry:Absolute FieldManager不显示自定义字段

时间:2011-05-14 11:38:41

标签: user-interface blackberry field css-position

我正在尝试制作一个绝对布局的菜单,其中包含扩展Field的自定义项。例如,这些项在Horizo​​ntalFieldManager中很好地显示,但是使用AbsoluteFieldManager它只显示一个空白屏幕。

到目前为止,这是我的代码:

/********************
 * CustomField.java *
 ********************/

import net.rim.device.api.system.Bitmap;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.Keypad;

public class CustomField extends Field {
    Bitmap img;
    String s1, s2;
    Font font;
    int textColorUnfocused, textColorFocused, bgColorUnfocused, bgColorFocused;

    public CustomField(long style) {
        super(style);
    }

    public CustomField(Bitmap img, String s1, String s2) {// , long style) {
        // super(style);
        this.img = img;
        this.s1 = s1;
        this.s2 = s2;
        this.font = Font.getDefault();
        textColorUnfocused = 0x000000;
        textColorFocused = 0xffffff;
        bgColorUnfocused = 0xffffff;
        bgColorFocused = 0x3956F7;
    }

    protected void layout(int maxWidth, int maxHeight) {
        Font font = getFont();
        int width = img.getWidth() + 10;
        int height = img.getHeight() + (font.getHeight() * 3);
        setExtent(Math.min(width, maxWidth), Math.min(height, maxHeight));

    }

    protected void onFocus(int direction) {

        super.onFocus(direction);
        invalidate();
    }

    protected void onUnfocus() {
        super.onUnfocus();
        invalidate();
    }

    public boolean isFocusable() {
        return true;
    }

    protected void paint(Graphics g) {

        // Draw background
        g.setColor(isFocus() ? bgColorFocused : bgColorUnfocused);
        g.fillRect(0, 0, getWidth(), getHeight());
        // draw image
        g.drawBitmap(5, 5, img.getWidth(), img.getHeight(), img, 0, 0);

        g.setColor(isFocus() ? textColorFocused : textColorUnfocused);
        // draw text
        g.drawText(s1, ((img.getWidth() + 10) / 2) - (font.getAdvance(s1) / 2),
                img.getHeight() + font.getHeight());
        g.drawText(s2, ((img.getWidth() + 10) / 2) - (font.getAdvance(s2) / 2),
                img.getHeight() + (2 * font.getHeight()));

    }

    protected boolean keyChar(char character, int status, int time) {
        if (character == Keypad.KEY_ENTER) {
            fieldChangeNotify(0);
            return true;
        }
        return super.keyChar(character, status, time);
    }

    public int getY() {

        return img.getHeight() + (font.getHeight() * 3);
    }

    public int getX() {
        return img.getWidth();
    }

}    

 /**************
 * MyApp.java *
 **************/
import net.rim.device.api.ui.UiApplication;


public class MyApp extends UiApplication{
    public static void main(String args[]){

        MyApp theApp = new MyApp();       
        theApp.enterEventDispatcher();
    }
    public MyApp()
    {        
        // Push a screen onto the UI stack for rendering.
        pushScreen(new MyScreen());
    } 
}




/*****************
 * MyScreen.java *
 *****************/
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.container.AbsoluteFieldManager;
import net.rim.device.api.ui.container.HorizontalFieldManager;
import net.rim.device.api.ui.container.MainScreen;

public class MyScreen extends MainScreen {
    public MyScreen() {
        AbsoluteFieldManager manager = new AbsoluteFieldManager();
        Bitmap img = Bitmap.getBitmapResource("1.png");
        CustomField cf1 = new CustomField(img, "an", "Item");
        CustomField cf2 = new CustomField(img, "another", "Item");
        manager.add(cf1, 10, 10);
        manager.add(cf2, 150, 150);
        //HorizontalFieldManager hfm = new HorizontalFieldManager(
            //  Manager.HORIZONTAL_SCROLL);
        //hfm.add(cf1); hfm.add(cf2);
        //add(hfm);
        add(manager);
    }

}

图像(1.png)http://www7.pic-upload.de/14.05.11/rhr4jcfuy9f8.png

如何让绝对经理显示我的自定义字段?

1 个答案:

答案 0 :(得分:1)

我的猜测是,AbsoluteFieldManager可能会将0, 0传递给自定义字段的layout方法。所以你的逻辑就是调用setExtent(0, 0)