2011-05-14 77 views
2

我正在尝试使用包含自定义项目的绝对布局来扩展字段。例如,这个项目在Horizo​​ntalFieldManager中很好地显示,但是使用AbsoluteFieldManager它只是显示一个空白屏幕。blackberry: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

我的猜测是,也许AbsoluteFieldManager正在将0, 0传递给您自定义字段的layout方法。所以你的逻辑叫做setExtent(0, 0)

+0

你是对的,非常感谢! – Cypherpunks 2011-05-14 13:27:12