BlackBerry - 创建自定义日期字段 [英] BlackBerry - Creating custom Date Field

查看:175
本文介绍了BlackBerry - 创建自定义日期字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一个看起来像这样的字段....可以任何人告诉我如何可以做到这一点,我可以使用哪个字段,我可以通过使用轨迹球/轮来选择值,或者在风暴的情况下可以滑动...



alt text http://www.freeimagehosting.net/uploads/4ae607b852.jpg

解决方案

它可以是简单的标签或位图字段扩展,具有导航事件处理。



您将需要保留String数组,其值将在水平导航中以圆圈形式更改。

如果此类自定义字段被集中,绘制和下阵列。



所以,DayOfWeek会有一个这样的字段,一个月份,一个是DayOfMonth,一个是Year。



将它们全部放在Horizo​​ntalFieldManager中,这将放在PopupScreen中,弹出窗口关闭所有值并组合Date值(可以通过FieldChangeListener传递)



更新



风暴支持



在具有车轮的设备上,导航点击关闭功能,但在Storm中将会出现问题(每个场焦点操作都会关闭对话框)。为了解决这个问题,添加了确定和取消按钮。



此外,touchEvent已添加到使用触摸点击来处理适当的价值变化。



您可以为RIM OS <= 4.6和RIM OS> = 4.7保留不同的实现,并将其替换为构建任务。





alt text http://img519.imageshack。我们/ img519 / 7312 / 8300.png alt text http:// img267 .imageshack.us / img267 / 6245 / 9000.jpg

alt text http://img9.imageshack.us/img9/9098/9530.png

  DatePickerDialog类扩展PopupScreen实现FieldChangeListener {

DatePickerField mDatePicker;
ButtonField mOKButton;
ButtonField mCancelButton;

public DatePickerDialog(Date date){
super(new VerticalFieldManager(),PopupScreen.DEFAULT_CLOSE);
add(mDatePicker = new DatePickerField(date));

//对RIM OS的评论< 4.7
addButtons();
}

private void addButtons(){
Horizo​​ntalFieldManager hfm = new Horizo​​ntalFieldManager(FIELD_HCENTER);
add(hfm);
mOKButton = new ButtonField(OK,ButtonField.CONSUME_CLICK);
mOKButton.setChangeListener(this);
hfm.add(mOKButton);
mCancelButton = new ButtonField(取消,ButtonField.CONSUME_CLICK);
mCancelButton.setChangeListener(this);
hfm.add(mCancelButton);
}

public void setDate(Date dateValue){
mDatePicker.setDate(dateValue);
}

public Date getDate(){
return mDatePicker.getDate();
}

public DatePickerDialog(){
this(Calendar.getInstance()。getTime());
}

//对RIM OS的评论< 4.7
public void fieldChanged(Field field,int context){
if(mOKButton == field){
getChangeListener()。fieldChanged(this,0);
close();
} else if(mCancelButton == field){
close();
}
}

//对RIM OS的评论> 4.6
// protected boolean navigationClick(int status,int time){
// getChangeListener()。fieldChanged(this,0);
// close();
// return super.navigationClick(status,time);
//}

class DatePickerField extends Horizo​​ntalFieldManager实现
FieldChangeListener {
private String [] daysOfWeek = new String [] {Sunday,Monday,
星期二,星期三,星期四,星期五,
星期六};
private String [] months = new String [] {Jan,Feb,Mar,Apr,
May,Jun,Jul ,Sep,Oct,Nov,
Dec};
private int mDayOfMonth = 10;
private int mMonth = 1;
private int mYear = 2009;

private StrTimeField mDayOfWeekField;
private StrTimeField mMonthField;
private NumTimeField mDayOfMonthField;
private NumTimeField mYearField;
日历calendar = Calendar.getInstance();

public DatePickerField(Date date){
calendar.setTime(date);
mYear = calendar.get(Calendar.YEAR);
// Calendar.JANUARY == 0,所以+1值
mMonth = calendar.get(Calendar.MONTH);
mDayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
//认为最好禁用星期几编辑
mDayOfWeekField = new StrTimeField(daysOfWeek,dayOfWeek - 1,
NON_FOCUSABLE);
mDayOfWeekField.setChangeListener(this);
add(mDayOfWeekField);
mMonthField = new StrTimeField(months,mMonth);
mMonthField.setChangeListener(this);
add(mMonthField);
mDayOfMonthField = new NumTimeField(mDayOfMonth,1,31);
mDayOfMonthField.setChangeListener(this);
add(mDayOfMonthField);
mYearField = new NumTimeField(mYear,1900,2012);
mYearField.setChangeListener(this);
add(mYearField);
}

public void fieldChanged(Field field,int context){
mDayOfMonth = mDayOfMonthField.getValue();
calendar.set(calendar.DAY_OF_MONTH,mDayOfMonth);
mMonth = mMonthField.getValue();
calendar.set(calendar.MONTH,mMonth);
mYear = mYearField.getValue();
calendar.set(calendar.YEAR,mYear);
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
mDayOfWeekField.setIndex(dayOfWeek);
}

public Date getDate(){
return calendar.getTime();
}

public void setDate(Date date){
calendar.setTime(date);
mYear = calendar.get(Calendar.YEAR);
mMonth = calendar.get(Calendar.MONTH);
mDayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK)
mDayOfWeekField.setIndex(dayOfWeek - 1);
mMonthField.setIndex(mMonth);
mDayOfMonthField.setValue(mDayOfMonth)
mYearField.setValue(mYear);
}

抽象类TimeField扩展LabelField {
int mWidth = 0;

public TimeField(){
super(,FOCUSABLE);
}

public TimeField(long style){
super(,style);
}

protected abstract void switchValue(int step);

protected boolean navigationMovement(int dx,int dy,
int status,int time){
if(Math.abs(dy)> Math.abs(dx)) {
switchValue(-dy);
返回true;
} else
return super.navigationMovement(dx,dy,status,time);
}

boolean prepared = false;

protected void onFocus(int direction){
prepared = false;
super.onFocus(direction);
}

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

//对RIM OS的评论< 4.7
protected boolean touchEvent(TouchEvent msg){
if(isFocus()&& msg.getEvent()== TouchEvent.CLICK){
if(!prepared){
prepared = true;
} else {
int y = msg.getY(1);
int cy = getTop()+(getHeight()>> 1);
switchValue((y> cy)?-1:1);
}
}
return false;
}

public int getPreferredWidth(){
return mWidth;
}

public int getPreferredHeight(){
return super.getPreferredHeight()+ 24;
}

protected void layout(int width,int height){
super.layout(width,height);
setExtent(getPreferredWidth(),getPreferredHeight());
}

protected void paint(Graphics graphics){
String text = getText();
Font font = getFont();
int x =(getPreferredWidth()
- font.getAdvance(text))>> 1;
int y =(getPreferredHeight() - font.getHeight())>> 1;
graphics.drawText(text,x,y);
if(isFocus()){
graphics.setColor(Color.WHITE);
int xc =(getPreferredWidth()>> 1);
int y1 = 10,y2 = 0,x2 = xc-9,x1 = xc + 9;

int [] xPts = new int [] {x1,x2,xc};
int [] yPts = new int [] {y1,y1,y2};
graphics.drawFilledPath(xPts,yPts,
null,null);

y2 = getPreferredHeight();
y1 = y2 - 10;

yPts = new int [] {y1,y1,y2};
graphics.drawFilledPath(xPts,yPts,
null,null);
}
}

public abstract int getValue();
}

class StrTimeField extends TimeField {
String [] mValues;
int mIndex;

public StrTimeField(String [] values){
this(values,0);
}

public StrTimeField(String [] values,int value){
this(values,value,FOCUSABLE);
}

public StrTimeField(String [] values,int value,long style){
super(style);
mValues = values;
setIndex(value);
Font font = getFont(); (int i = 0; i< mValues.length; i ++){
int width = font.getAdvance(mValues [i]);

mWidth = Math.max(mWidth,width);
}
mWidth + = 10;
}

protected void switchValue(int step){
int index = mIndex + step;
if(index< 0 || index> = mValues.length)
index + =((index> 0)?-1:1)
* mValues.length;
setIndex(index);
}

private void setIndex(int index){
if(index> = 0&& index< mValues.length){
mIndex =指数;
setText(mValues [mIndex]);
}
}

public int getValue(){
return mIndex;
}

}

class NumTimeField extends TimeField {
int mValue;
int mMinValue;
intmMaxValue;

public NumTimeField(int val,int minVal,int maxVal){
this(val,minVal,maxVal,FOCUSABLE);
}

public NumTimeField(int val,int minVal,int maxVal,
long style){
super(style);
mValue = val;
mMinValue = minVal;
mMaxValue = maxVal;

setText(String.valueOf(mValue));
int maxDig = String.valueOf(mMaxValue).length();
String test =; (int i = 0; i< maxDig; i ++)
test + =0;

mWidth = getFont()。getAdvance(test);
mWidth + = 10;
}

protected void switchValue(int step){
int value = mValue + step;
if(value> mMaxValue)
value = value - (mMaxValue - mMinValue + 1);
if(value< mMinValue)
value = value +(mMaxValue - mMinValue + 1);
setValue(value);
}

private void setValue(int value){
mValue = value;
setText(String.valueOf(mValue));
}

public int getValue(){
return mValue;
}
}
}
}


i want to create a field that looks like this ....can any one tell me how this could be done which field could i use where in i can select values by using the trackball/wheel or in case of storm i could slide...

alt text http://www.freeimagehosting.net/uploads/4ae607b852.jpg

解决方案

It could be simple Label or Bitmap Field extention, with navigation event handling.

You will need to hold String array with values which will be changed in circle on horizontal navigation.
If such custom Field is focused, draw Up and Down arrays.

So, there will be one such Field for DayOfWeek, one for Month, one for DayOfMonth, one for Year.

Place them all in HorizontalFieldManager, which will be placed in PopupScreen, on popup close geather all values and compose Date value (may be passed over FieldChangeListener)

UPDATE

Storm support

On devices with wheel its easy to implement save-and-close functionality on navigation click, but in Storm that would be a problem (dialog will be closed on each field focus action). To solve this, OK and Cancel buttons added.

Also, touchEvent added to handle proper value change using touch click.

You may keep different implementations for RIM OS <= 4.6 and RIM OS >= 4.7, and replace them on build task.

Source

alt text http://img519.imageshack.us/img519/7312/8300.pngalt text http://img267.imageshack.us/img267/6245/9000.jpg
alt text http://img9.imageshack.us/img9/9098/9530.png

class DatePickerDialog extends PopupScreen implements FieldChangeListener {

    DatePickerField mDatePicker;
    ButtonField mOKButton;
    ButtonField mCancelButton;

    public DatePickerDialog(Date date) {
        super(new VerticalFieldManager(), PopupScreen.DEFAULT_CLOSE);
        add(mDatePicker = new DatePickerField(date));

        // comment on RIM OS < 4.7
        addButtons();
    }

    private void addButtons() {
        HorizontalFieldManager hfm = new HorizontalFieldManager(FIELD_HCENTER);
        add(hfm);
        mOKButton = new ButtonField("OK", ButtonField.CONSUME_CLICK);
        mOKButton.setChangeListener(this);
        hfm.add(mOKButton);
        mCancelButton = new ButtonField("Cancel", ButtonField.CONSUME_CLICK);
        mCancelButton.setChangeListener(this);
        hfm.add(mCancelButton);
    }

    public void setDate(Date dateValue) {
        mDatePicker.setDate(dateValue);
    }

    public Date getDate() {
        return mDatePicker.getDate();
    }

    public DatePickerDialog() {
        this(Calendar.getInstance().getTime());
    }

    // comment on RIM OS < 4.7
    public void fieldChanged(Field field, int context) {
        if (mOKButton == field) {
            getChangeListener().fieldChanged(this, 0);
            close();
        } else if (mCancelButton == field) {
            close();
        }
    }

    // comment on RIM OS > 4.6
    // protected boolean navigationClick(int status, int time) {
    // getChangeListener().fieldChanged(this, 0);
    // close();
    // return super.navigationClick(status, time);
    // }

    class DatePickerField extends HorizontalFieldManager implements
            FieldChangeListener {
        private String[] daysOfWeek = new String[] { "Sunday", "Monday",
                "Tuesday", "Wednesday", "Thursday", "Friday", 
                "Saturday" };
        private String[] months = new String[] { "Jan", "Feb", "Mar", "Apr",
                "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", 
                "Dec" };
        private int mDayOfMonth = 10;
        private int mMonth = 1;
        private int mYear = 2009;

        private StrTimeField mDayOfWeekField;
        private StrTimeField mMonthField;
        private NumTimeField mDayOfMonthField;
        private NumTimeField mYearField;
        Calendar calendar = Calendar.getInstance();

        public DatePickerField(Date date) {
            calendar.setTime(date);
            mYear = calendar.get(Calendar.YEAR);
            // Calendar.JANUARY == 0, so +1 value
            mMonth = calendar.get(Calendar.MONTH);
            mDayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
            int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
            // think it's better to disable Day Of Week edit
            mDayOfWeekField = new StrTimeField(daysOfWeek, dayOfWeek - 1,
                    NON_FOCUSABLE);
            mDayOfWeekField.setChangeListener(this);
            add(mDayOfWeekField);
            mMonthField = new StrTimeField(months, mMonth);
            mMonthField.setChangeListener(this);
            add(mMonthField);
            mDayOfMonthField = new NumTimeField(mDayOfMonth, 1, 31);
            mDayOfMonthField.setChangeListener(this);
            add(mDayOfMonthField);
            mYearField = new NumTimeField(mYear, 1900, 2012);
            mYearField.setChangeListener(this);
            add(mYearField);
        }

        public void fieldChanged(Field field, int context) {
            mDayOfMonth = mDayOfMonthField.getValue();
            calendar.set(calendar.DAY_OF_MONTH, mDayOfMonth);
            mMonth = mMonthField.getValue();
            calendar.set(calendar.MONTH, mMonth);
            mYear = mYearField.getValue();
            calendar.set(calendar.YEAR, mYear);
            int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
            mDayOfWeekField.setIndex(dayOfWeek);
        }

        public Date getDate() {
            return calendar.getTime();
        }

        public void setDate(Date date) {
            calendar.setTime(date);
            mYear = calendar.get(Calendar.YEAR);
            mMonth = calendar.get(Calendar.MONTH);
            mDayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
            int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
            mDayOfWeekField.setIndex(dayOfWeek - 1);
            mMonthField.setIndex(mMonth);
            mDayOfMonthField.setValue(mDayOfMonth);
            mYearField.setValue(mYear);
        }

        abstract class TimeField extends LabelField {
            int mWidth = 0;

            public TimeField() {
                super("", FOCUSABLE);
            }

            public TimeField(long style) {
                super("", style);
            }

            protected abstract void switchValue(int step);

            protected boolean navigationMovement(int dx, int dy, 
                    int status, int time) {
                if (Math.abs(dy) > Math.abs(dx)) {
                    switchValue(-dy);
                return true;
                } else
                    return super.navigationMovement(dx, dy, status, time);
            }

            boolean prepared = false;

            protected void onFocus(int direction) {
                prepared = false;
                super.onFocus(direction);
            }

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

            // comment on RIM OS < 4.7
            protected boolean touchEvent(TouchEvent msg) {
                if (isFocus() && msg.getEvent() == TouchEvent.CLICK) {
                    if (!prepared) {
                        prepared = true;
                    } else {
                        int y = msg.getY(1);
                        int cy = getTop() + (getHeight() >> 1);
                        switchValue((y > cy) ? -1 : 1);
                    }
                }
                return false;
            }

            public int getPreferredWidth() {
                return mWidth;
            }

            public int getPreferredHeight() {
                return super.getPreferredHeight() + 24;
            }

            protected void layout(int width, int height) {
                super.layout(width, height);
                setExtent(getPreferredWidth(), getPreferredHeight());
            }

            protected void paint(Graphics graphics) {
                String text = getText();
                Font font = getFont();
                int x = (getPreferredWidth() 
                    - font.getAdvance(text)) >> 1;
                int y = (getPreferredHeight() - font.getHeight()) >> 1;
                graphics.drawText(text, x, y);
                if (isFocus()) {
                    graphics.setColor(Color.WHITE);
                    int xc = (getPreferredWidth() >> 1);
                    int y1 = 10, y2 = 0, x2 = xc - 9, x1 = xc + 9;

                    int[] xPts = new int[] { x1, x2, xc };
                    int[] yPts = new int[] { y1, y1, y2 };
                    graphics.drawFilledPath(xPts, yPts, 
                        null, null);

                    y2 = getPreferredHeight();
                    y1 = y2 - 10;

                    yPts = new int[] { y1, y1, y2 };
                    graphics.drawFilledPath(xPts, yPts, 
                        null, null);
                }
            }

            public abstract int getValue();
        }

        class StrTimeField extends TimeField {
            String[] mValues;
            int mIndex;

            public StrTimeField(String[] values) {
                this(values, 0);
            }

            public StrTimeField(String[] values, int value) {
                this(values, value, FOCUSABLE);
            }

            public StrTimeField(String[] values, int value, long style) {
                super(style);
                mValues = values;
                setIndex(value);
                Font font = getFont();
                for (int i = 0; i < mValues.length; i++) {
                    int width = font.getAdvance(mValues[i]);
                    mWidth = Math.max(mWidth, width);
                }
                mWidth += 10;
            }

            protected void switchValue(int step) {
                int index = mIndex + step;
                if (index < 0 || index >= mValues.length)
                    index += ((index > 0) ? -1 : 1) 
                        * mValues.length;
                setIndex(index);
            }

            private void setIndex(int index) {
                if (index >= 0 && index < mValues.length) {
                    mIndex = index;
                    setText(mValues[mIndex]);
                }
            }

            public int getValue() {
                return mIndex;
            }

        }

        class NumTimeField extends TimeField {
            int mValue;
            int mMinValue;
            int mMaxValue;

            public NumTimeField(int val, int minVal, int maxVal) {
                this(val, minVal, maxVal, FOCUSABLE);
            }

            public NumTimeField(int val, int minVal, int maxVal,
                    long style) {
                super(style);
                mValue = val;
                mMinValue = minVal;
                mMaxValue = maxVal;

                setText(String.valueOf(mValue));
                int maxDig = String.valueOf(mMaxValue).length();
                String test = "";
                for (int i = 0; i < maxDig; i++)
                    test += "0";
                mWidth = getFont().getAdvance(test);
                mWidth += 10;
            }

            protected void switchValue(int step) {
                int value = mValue + step;
                if (value > mMaxValue)
                    value = value - (mMaxValue - mMinValue + 1);
                if (value < mMinValue)
                    value = value + (mMaxValue - mMinValue + 1);
                setValue(value);
            }

            private void setValue(int value) {
                mValue = value;
                setText(String.valueOf(mValue));
            }

            public int getValue() {
                return mValue;
            }
        }
    }
}

这篇关于BlackBerry - 创建自定义日期字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆