Blackberry:创建自定义字段以与VerticalFieldManager一起使用以复制tableview

时间:2011-12-21 22:12:01

标签: blackberry

我不知道我是否采取了正确的路线,但我决定制作一个自定义字段并在verticalfieldmanager中使用它。

在自定义字段中,我想在左侧添加图像,在右侧添加文本。

我刚刚开始,但遇到了一些问题。

package mypackage;

import net.rim.device.api.ui.DrawStyle;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Graphics;

public class CustomEventField extends Field implements DrawStyle {

    private String title;
    private String by;
    private String date;
    private String desc;


    public CustomEventField(String title, String by, String date, String desc){
        super();
        this.title = title;
        this.by = by;
        this.date = date;
        this.desc = desc;

    }

    protected void layout(int width, int height) {
        setExtent(width,height);

    }

    protected void paint(Graphics graphics) {

        graphics.drawText(this.title, 0, 0);

        graphics.drawText(this.by, 50, 0);


    }

}

如何让drawText从drawText前往下一行呢?我是否必须计算字体的高度并将其添加到y位置?

1 个答案:

答案 0 :(得分:2)

根据上面的代码,它可能不具备,所以我制作了一个可以显示图像,标题,日期的自定义类。当您单击项目时,将显示一个对话框,其中包含其索引编号 这对自定义列表视图也很有用

注意:如果您想尝试此处提供的以下图片,请使用此PLease download sample images from here

如果有任何更正请告诉我

class CustomListField extends HorizontalFieldManager{

        private Bitmap scale_image;
        private int width=0;
        private int height=0;
        private int background_color=0;
        private BitmapField bitmap_field;
        private boolean flag=false;
        public CustomListField(String title, Bitmap image, String date,int image_width,int image_height,int background_color){
            super(NO_HORIZONTAL_SCROLL|USE_ALL_WIDTH);
            this.background_color=background_color;
            width=image_width;
            height=image_width;
            if(image!=null){
                scale_image=new Bitmap(image_width, image_height);
                image.scaleInto(scale_image, Bitmap.FILTER_LANCZOS);
                bitmap_field=new BitmapField(scale_image);
                flag=false;
                bitmap_field.setMargin(5, 5, 5, 5);
                add(bitmap_field);
            }


            VerticalFieldManager vmanager=new VerticalFieldManager(USE_ALL_WIDTH|Field.FIELD_VCENTER){
                protected void sublayout(int maxWidth, int maxHeight) {
                    super.sublayout(Display.getWidth()-width, height);
                    setExtent(Display.getWidth()-width, height);
                }
            };
            LabelField title_lbl=new LabelField("Title: "+title,Field.NON_FOCUSABLE|DrawStyle.ELLIPSIS);
            vmanager.add(title_lbl);

            LabelField date_lbl=new LabelField("Date: "+date,Field.NON_FOCUSABLE);
            vmanager.add(date_lbl);

            Font fon=title_lbl.getFont();
            int title_height=fon.getHeight();

            Font font=date_lbl.getFont();
            int date_height=font.getHeight();
            int pad=title_height+date_height;
            title_lbl.setPadding((height-pad)/2, 0, 0, 0);
            add(vmanager);
            add(new NullField(FOCUSABLE));
        }

        protected void sublayout(int maxWidth, int maxHeight) {
            super.sublayout(Display.getWidth(), height);
            setExtent(Display.getWidth(), height);
        }
        protected void paint(Graphics graphics) {
            if(flag)
            graphics.setBackgroundColor(background_color);
            graphics.clear();
            super.paint(graphics);
        }
        protected void onFocus(int direction) {
            super.onFocus(direction);
            flag=true;
            invalidate();
        }
        protected void onUnfocus() {
            invalidate();
            flag=false;
        }
        protected boolean navigationClick(int status, int time) {

            if(Touchscreen.isSupported()){
                return false;
            }else{
                fieldChangeNotify(1);
                return true;
            }

        }
        protected boolean touchEvent(TouchEvent message) 
        {
            if (TouchEvent.CLICK == message.getEvent()) 
            {

                FieldChangeListener listener = getChangeListener();
                if (null != listener)
                    this.setFocus();
                    listener.fieldChanged(this, 1);
            }
            return super.touchEvent(message);
        }
    }

你可以按照以下方式调用这个类,你必须传递Bitmap,title,image_height和width,以及background clolor

      class sampleScreen extends MainScreen implements FieldChangeListener
        {
            private CustomListField cu_field[];
            private Bitmap image=null;
            int size=8;
            public sampleScreen() {
                VerticalFieldManager vmanager=new VerticalFieldManager(VERTICAL_SCROLL|VERTICAL_SCROLLBAR){
                    protected void sublayout(int maxWidth, int maxHeight) {

                        super.sublayout(Display.getWidth(),Display.getHeight());
                        setExtent(Display.getWidth(),Display.getHeight());
                    }
                };
                cu_field=new CustomListField[size]; 
                for(int i=0;i<size;i++){
                    image=Bitmap.getBitmapResource("sample_"+i+".jpg");
cu_field[i]=new CustomListField("BlackBerry models that had a built-in mobile phone, were the first models that natively ran Java, and transmitted data over the normal 2G cellular network. RIM began to advertise these devices as email-capable mobile phones rather than as 2-way pagers.",
     image, "jan2011", 100, 100,Color.RED);
                    cu_field[i].setChangeListener(this);
                    vmanager.add(new SeparatorField());
                    vmanager.add(cu_field[i]);
                }
                add(vmanager);
            }

            public void fieldChanged(Field field, int context) {
                // TODO Auto-generated method stub
                for(int i=0;i<size;i++){
                    if(field==cu_field[i]){
                        final int k=i;
                        UiApplication.getUiApplication().invokeLater(new Runnable() {
                            public void run() {
                                Dialog.alert("You click on Item No "+k);
                            }
                        });
                    }
                }
            }
        }

在这里,您将获得如下图所示的输出

This is out put for above code