代码之家  ›  专栏  ›  技术社区  ›  CAMOBAP

Blackberry-如何将DateField的日期选择器弹出窗口居中

  •  0
  • CAMOBAP  · 技术社区  · 13 年前

    我有 DateField 在我的屏幕中央

    enter image description here

    当我触摸它时,我看到:

    enter image description here

    但我想看到:

    enter image description here

    我的问题是:

    如何将日期选择器弹出窗口居中 日期字段 ?

    黑莓操作系统6

    更新:

    public class MyMainScreen extends MainScreen
    {
        protected DateField dateField_ = null;
        protected VerticalFieldManager container_ = null;
    
        public MyMainScreen()
        {
            super();
            container_ = new VerticalFieldManager(VerticalFieldManager.VERTICAL_SCROLL
                | VerticalFieldManager.VERTICAL_SCROLLBAR | VerticalFieldManager.USE_ALL_HEIGHT)
            {
                protected void sublayout(int width, int height)
                {
                    super.sublayout(width, height);
    
                    layoutChild(dateField_ , 100, 40);
                    setPositionChild(dateField_ , (width - 100) / 2, 50);
    
                    setVirtualExtent(width, 50);
                }
            };
    
            add(container_);
            dateField_ = new DateField("", new Date(), new SimpleDateFormat("HH:mm"), Field.FIELD_HCENTER |
                    DrawStyle.HCENTER | Field.FOCUSABLE);
    
            container_.add(dateField_);
            add(container_);
        }
    }
    
    2 回复  |  直到 13 年前
        1
  •  1
  •   Nate    13 年前

    好的,所以有几个问题:

    1. 这个 DateField 不会因为你传球就把球打到中心 Field.FIELD_HCENTER | DrawStyle.HCENTER 到构造函数中。我不认为 日期字段 甚至可以识别这些标志。

    2. A. VerticalFieldManager 很特别 Manager 它的设计是按照你的顺序从上到下垂直排列它的孩子 add() 他们如果你是 要这样布置田地,那么我不知道你是否应该扩建 垂直字段管理器 。只需延伸 经理 如果您想直接实现 sublayout() 。此外,呼叫 super.sublayout() 在您的实现中可能会导致问题。

    3. 您正在对您的 日期字段 。我不确定它是否允许这样做。

    4. 您的代码实际上并没有为我编译,因为 日期字段 构造函数接受 long 日期,而不是 Date 。不过这与居中没有任何关系。

    所以,我推荐这样的东西:

      super(MainScreen.VERTICAL_SCROLL | MainScreen.VERTICAL_SCROLLBAR);
    
      dateField_ = new DateField("", (new Date()).getTime(), new SimpleDateFormat("HH:mm"), Field.FOCUSABLE);
    
      container_ = new Manager(Manager.VERTICAL_SCROLL | Manager.VERTICAL_SCROLLBAR) {
         public int getPreferredHeight() {
            return Display.getHeight();
         }
         public int getPreferredWidth() {
            return Display.getWidth();
         }
         protected void sublayout(int width, int height) {            
            int h = Math.min(height, Display.getHeight());
            setExtent(width, h);
            // only needed if there's actually more content than fits in the visible area
            //setVirtualExtent(width, h + ?);
    
            int dfWidth = dateField_.getPreferredWidth();
            int dfHeight = dateField_.getPreferredHeight();
            layoutChild(dateField_, dfWidth, dfHeight);
            setPositionChild(dateField_, (width - dfWidth) / 2, (h - dfHeight) / 2);
         }                                      
      };
    
      container_.add(dateField_);      
      add(container_);
    

    附言:我不确定你是否想要滚动。只有一个 日期字段 ,没有理由滚动。但是,我知道你的真实 Screen 可能有更多内容,所以您可能需要 setVirtualExtent() ,我已经对此进行了评论。

        2
  •  0
  •   CAMOBAP    13 年前

    这个解决方案也适用于我:

    package com.my.package;
    
    import java.util.Calendar;
    import java.util.Date;
    
    import net.rim.device.api.i18n.SimpleDateFormat;
    import net.rim.device.api.ui.DrawStyle;
    import net.rim.device.api.ui.Field;
    import net.rim.device.api.ui.Manager;
    import net.rim.device.api.ui.TouchEvent;
    import net.rim.device.api.ui.UiApplication;
    import net.rim.device.api.ui.component.DateField;
    import net.rim.device.api.ui.container.VerticalFieldManager;
    import net.rim.device.api.ui.picker.DateTimePicker;
    
    public class MyDateManager extends VerticalFieldManager {
        protected DateField dateField_ = null;
        protected DateTimePicker dateTimePicker_ = null;
        protected SimpleDateFormat dateFormat_ = null;
    
        public MyDateManager() {
            super(Manager.FIELD_HCENTER | Manager.FIELD_VCENTER);
            dateFormat_ = new SimpleDateFormat("HH:mm");
            dateField_ = new DateField("", new Date().getTime(), dateFormat_,
                    Field.FIELD_HCENTER | DrawStyle.HCENTER | Field.FOCUSABLE) {
                protected boolean touchEvent(TouchEvent paramTouchEvent) {
                    if (paramTouchEvent.getEvent() == TouchEvent.CLICK) {
                        dateField_.setEnabled(false);
                        showDatePicker();
                    }
                    return super.touchEvent(paramTouchEvent);
                }
    
                protected boolean trackwheelClick(int paramInt1, int paramInt2) {
                    dateField_.setEnabled(false);
                    showDatePicker();
    
                    return super.trackwheelClick(paramInt1, paramInt2);
                }
            };
            this.add(dateField_);
        }
    
        protected void sublayout(int width, int height) {
            layoutChild(dateField_, width, height);
            setPositionChild(dateField_, (width - dateField_.getWidth()) / 2,
                    (height - dateField_.getHeight()) / 2);
            int h = dateField_.getHeight();
            if (h <= 0)
                h = height;
            setExtent(width, h);
        }
    
        protected void showDatePicker() {
            if (dateTimePicker_ == null) {
                Calendar cal = Calendar.getInstance();
    
                // HACK
                String dateFormat = dateFormat_.toPattern().indexOf("H", 0) == -1 ? dateFormat_
                        .toPattern() : null;
                String timeFormat = dateFormat_.toPattern().indexOf("H", 0) != -1 ? dateFormat_
                        .toPattern() : null;
    
                dateTimePicker_ = DateTimePicker.createInstance(cal, dateFormat,
                        timeFormat);
                UiApplication.getUiApplication().invokeLater(new Runnable() {
                    public void run() {
                        if (dateTimePicker_.doModal()) {
                            dateField_.setDate(dateTimePicker_.getDateTime()
                                    .getTime());
                        }
    
                        dateField_.setEnabled(true);
                        dateField_.setFocus();
                        dateTimePicker_ = null;
                    }
                });
            }
        }
    }