سؤال

في محاولة لتقليل ارتفاع أ DateField من الافتراضي 53 إلى 32 ، ولكن دون جدوى. يبقى الارتفاع كما هو مع النتيجة التي يظهر فيها النص إلى أسفل الخلفية التي تكون أصغر في الارتفاع (32).

حاولت طريقتان:

    DateField dtf = new DateField(label, defaultDateTime, DateField.DATE_TIME | DrawStyle.LEFT | DrawStyle.TOP | Field.FOCUSABLE | Field.READONLY )
    {
        protected void layout(int width, int height)
        {
            Bitmap bmp = UIElements.GetBitmap(UIElements.IMG_DROPDOWN_BG, true);

            width = bmp.getWidth();
            height = bmp.getHeight();
            super.setExtent(width, height);

            super.layout(width, height);
        }           
    };

الطريقة الثانية (استنادًا إلى منشور فائض مكدس):

public class MyDateManager extends VerticalFieldManager {
    protected DateField dateField_ = null;
    public MyDateManager(String label, long defaultDateTime) {
        super(Manager.FIELD_HCENTER | Manager.FIELD_VCENTER);
        dateField_ = new DateField(label, defaultDateTime, DateField.DATE_TIME |
            Field.FIELD_HCENTER | DrawStyle.HCENTER | Field.FOCUSABLE | Field.READONLY);

        this.add(dateField_);
    }

    protected void sublayout(int width, int height) {
        Bitmap bmp = UIElements.GetBitmap(UIElements.IMG_DROPDOWN_BG, false);

        width = bmp.getWidth();
        height = bmp.getHeight();

        layoutChild(dateField_, width, height);
        dateField_.setBackground(BackgroundFactory.createBitmapBackground(bmp, 0, 0, Background.REPEAT_NONE));
        int h = dateField_.getHeight();
        setExtent(width, height);
    }
 }

الرجاء الاقتراح.

شكرًا

هل كانت مفيدة؟

المحلول

الطريقة الثانية هي نهج فظيع (العبث مع ارتفاع VerticalfieldManager سيحصل على الكثير من المشاكل).

جرب الطريقة الأولى مرة أخرى ، ولكن هذه المرة اتصل super.layout أول:

    DateField dtf = new DateField(label, defaultDateTime, DateField.DATE_TIME | DrawStyle.LEFT | DrawStyle.TOP | Field.FOCUSABLE | Field.READONLY )
    {
        protected void layout(int width, int height) {
            super.layout(width, height);

            Bitmap bmp = UIElements.GetBitmap(UIElements.IMG_DROPDOWN_BG, true);

            width = bmp.getWidth();
            height = bmp.getHeight();
            super.setExtent(width, height);
        }           
    };

لاحظ أنه باستخدام هذا النهج ، قد تحصل أيضًا على مواطن الخلل ، لأنك تتجاوز طريقة عمياء دون النظر في بقية الفصل. للقيام بذلك بأمان ، ستحتاج إلى الوصول إلى مصدر الفئة الأصل ، ولا تفعل ذلك.

أود أن أقترح تمديد HorizontalFieldManager (تجاوز sublayout) للحصول على ارتفاع ثابت (لا تقم أبدًا VFM لأن التمرير يسير في نفس الاتجاه الذي تحاول إجراء ثابت). ثم ضع داخل حقل تاريخ عادي يستخدم جميع الارتفاع المتاح (تمرير العلم Field.USE_ALL_HEIGHT في المنشئ).

مزيد من المعلومات:http://docs.blackberry.com/es-es/developers/deliverables/29251/determining_the_dimensions_of_a_field_157864_11.jsp

نصائح أخرى

أظن أن هذه معركة من المحتمل أن تفقدها.

أنا شخصياً سأقوم بإنشاء مظهر من الحقول من Labelfield والذي سيمنحك القيود التي تحتاجها.

DateField هو مجال متخصص وفي اختباري ، فسيتجاهل القيود التي وضعتها عليه ، بغض النظر عما إذا كنت تحاول القيام بذلك عبر المدير المحتوي أو مباشرة في طريقة تخطيط الحقل. يبدو أن الارتفاع الفعلي الذي سيختاره لنفسه سيختلف حسب الجهاز.

أظن على جميع الأجهزة القادرة على الشاشة التي تعمل باللمس ، وسوف تحاول إعطاء نفسها ارتفاعًا كافيًا لتتطرق إليها. فيما يتعلق بالبكسلات التي تعتمد على دقة (DPI) للجهاز ، كما ينبغي في الواقع ، فإن صورتك يجب أن تبدو مختلفة على جهاز عالي الدقة ، مثل جهاز 9900 إلى جهاز منخفض الدقة ، مثل 9300.

أظن على الأجهزة غير الشاشة ، فمن المحتمل أن تتبع حجم الخط المحدد.

لقد اختبرت الرمز التالي:

    DateField dtf1 = new DateField("test1", System.currentTimeMillis(), DateField.DATE_TIME | DrawStyle.LEFT | DrawStyle.TOP | Field.FOCUSABLE | Field.READONLY ) {
        protected void layout(int width, int height) {
            super.layout(width, 32);
            System.out.println("height1: " + Integer.toString(this.getHeight()));
        }           
    };
    DateField dtf2 = new DateField("test2", System.currentTimeMillis(), DateField.DATE_TIME | DrawStyle.LEFT | DrawStyle.TOP | Field.FOCUSABLE ) {
        protected void layout(int width, int height) {
            super.layout(width, 32);
            System.out.println("height2: " + Integer.toString(this.getHeight()));
        }           
    };
    DateField dtf3 = new DateField("test3", System.currentTimeMillis(), DateField.DATE_TIME | DrawStyle.LEFT | DrawStyle.TOP | Field.FOCUSABLE ) {
        protected void layout(int width, int height) {
            super.layout(width, 32);
            System.out.println("height3: " + Integer.toString(this.getHeight()));
        }           
    };

...

        add(dtf1);
        add(dtf2);
        Font smallFont = this.getFont().derive(Font.PLAIN, 15);
        dtf3.setFont(smallFont);
        add(dtf3);

في 9800 ، كان حقل Datefield دائمًا 40 بكسل في الارتفاع. على 9300 كان 18 للأول 2 و 15 للثالث.

لذلك ، نظرًا لأنك تستخدم حقل التاريخ هذا فقط لعرض قيمة غير قابلة للتحديث ، فإنني أوصي بدلاً من ذلك بأن تنظر في استخدام شيء مثل SimpleDateFormat ، لتنسيق التاريخ كما تريد ، وعرض هذا في Labelfield. يمكنك بعد ذلك إدارة ارتفاع الحقل باستخدام الخط الذي تحدده.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top