0

DateField画面の中央にあります

ここに画像の説明を入力してください

そして私がそれに触れると私は見る:

ここに画像の説明を入力してください

しかし、私は見たいです:

ここに画像の説明を入力してください

私の質問は:

日付ピッカーポップアップを中央に配置するにはどうすればよいDateFieldですか?

ブラックベリーOS6

アップデート:

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_);
    }
}
4

2 に答える 2

1

さて、いくつかの問題があります:

  1. コンストラクターDateFieldに渡したからといって、フィールドが中央に配置されることはありません。私はそれらの旗さえ認識Field.FIELD_HCENTER | DrawStyle.HCENTERしないと思います。DateField

  2. Aは、子を上から下に順番に垂直に配置するように設計されVerticalFieldManagerたスペシャルです。あなたがそのようにフィールドをレイアウトするつもりがないのなら、私はあなたが拡張すべきかどうかわかりません。を実装する場合は、直接拡張するだけです。また、実装を呼び出すと問題が発生する可能性があります。Manageradd()VerticalFieldManagerManagersublayout()super.sublayout()

  3. の高さ/幅をハードコーディングしていますDateField。それが可能かどうかはわかりません。

  4. DateFieldコンストラクターは。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_);

PSスクロールしたいかどうかわかりませんでした。だけでDateField、スクロールする理由はありません。しかし、私はあなたの本当のScreen方がおそらくもっと多くのコンテンツを持っていることを知っているので、あなたはそうする必要があるかもしれませんsetVirtualExtent()、それは私がコメントしました。

于 2013-03-08T09:36:14.173 に答える
0

この解決策は私にも役立ちます:

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;
                }
            });
        }
    }
}
于 2013-03-08T14:58:48.790 に答える