BlackBerry- 맞춤 날짜 필드 생성
-
19-09-2019 - |
해결책
내비게이션 이벤트 처리와 함께 간단한 레이블 또는 비트 맵 필드 확장 일 수 있습니다.
수평 내비게이션에서 원으로 변경 될 값으로 문자열 배열을 고정해야합니다.
이러한 사용자 정의 필드가 집중되면 배열을 늘리고 아래로 옮깁니다.
따라서, 주 1 일, 한 달에는 한 번, 하나는 일요일, 1 년에는 1 년 동안 그러한 분야가있을 것입니다.
팝업에 팝업 화면에 배치 될 HorizontalfieldManager에 모두 배치하십시오.
업데이트
폭풍 지원
휠이있는 장치에서는 내비게이션에서 저장 및 클로즈 기능을 쉽게 구현할 수 있지만 스톰에서는 문제가 될 수 있습니다 (대화 상자는 각 필드 초점 작업에서 닫힙니다). 이를 해결하려면 확인 및 취소 버튼이 추가되었습니다.
또한 터치 클릭을 사용하여 적절한 값 변경을 처리하기 위해 TouchEvent가 추가되었습니다.
RIM OS <= 4.6 및 Rim OS> = 4.7에 대한 다른 구현을 유지하고 빌드 작업에서 교체 할 수 있습니다.
원천
Alt Text http://img519.imageshack.us/img519/7312/8300.png대체 텍스트 http://img267.imageshack.us/img267/6245/9000.jpg
대체 텍스트 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;
}
}
}
}
다른 팁
5.0 API에 소개 된 새로운 필드가 있습니다. SpinboxFieldManager. 특정 경우에도 a가 있습니다 DateTimePicker 날짜/시간 만. 5.0 이전의 운영 체제의 경우 고유 한 사용자 정의 컨트롤을 만들어야합니다.
이것은 Max의 게시물에 대한 의견입니다 (의견을 게시하기에 충분한 크레딧이 없으므로 답변이 할 것입니다)
당신이 그의 게시물을 사용하고 있다면, 달력은 매월 31 일 동안 하드 코딩되고 있다고 조언하십시오.
mDayOfMonthField = new NumTimeField(mDayOfMonth, 1, 31);
31 대신 사용해야합니다.
net.rim.device.api.util.DateTimeUtilities.getNumberOfDaysInMonth(month, year);