Обновление состояния поля - PullRequest
0 голосов
/ 09 декабря 2011

В моем приложении я использую настраиваемые поля с методами set ***, которые изменяют некоторые параметры этих полей (например, фоновое изображение).все работает нормально, только одна проблема: я устанавливаю и изменяю параметры этих полей, как показано ниже:

    record = new UIButton("RECORD", Field.FOCUSABLE, kButtonWidth/3-5, kButtonHeight);
    vfm2.add(Record); //I tryed this befor setters and after: no different
    record.setBackgroundImage("buttonDark.png", "buttonDark.png", "buttonDark.png");
    record.setTitleFontSize(Display.getHeight()/40);
    record.setTitle("RECORD");

При нажатии на экран с этими полями мое поле выглядит так, как будто не было вызвано никаких сеттеровэто было: я проверил это через сообщения журнала).Состояние поля обновляется только после того, как оно сфокусировано (я вызываю одни и те же сеттеры на onFocus и на onUnFocus, где у меня invalidate()).Есть ли способ обновить его на экране появиться?Например, в iPhone SDK есть метод viewDidAppear, который обрабатывается, когда вид (экран) появляется.Есть ли такое же в ежевике?Или любое другое решение?


Вот мой код UIButton класса:

public class UIButton extends Field 
{       
    private String title = null;
    private Font font;
    private int fontSize;
    private int color;
    private int horizontalAligment;
    private int state;  //0 - normal;   1 - focused;    2 - HightLighted;

    private int height;
    private int width;

    private EncodedImage currentPicture;
    private EncodedImage onPicture;
    private EncodedImage offPicture;
    private EncodedImage lightPicture;

    public UIButton(long style, int Widgh, int Height)
    {
        super(style);

        height = Height;
        width = Widgh;
        fontSize = Display.getHeight()/20;
        FontFamily ff = getFont().getFontFamily();
        font = ff.getFont(0, fontSize);
        title = "";
        color = Color.WHITE;
        state = 0;
        horizontalAligment = DrawStyle.HCENTER;

        onPicture = offPicture = lightPicture = EncodedImage.getEncodedImageResource("buttonDark.png");
        currentPicture = offPicture;

    }

    public String getTitle()
    {
        return title;
    }

    public void setTitleColor (int Color) {
        color = Color;
        invalidate();
    }

    public void setFrame (int Height, int Width) {
        height = Height;
        width = Width;
        invalidate();
    }

    public void setTitle (String Title) {
        title = Title;
        invalidate();
    }

    public void setTitleHorizontalAligment (int hAligment) {
        horizontalAligment = hAligment;
        invalidate();
    }

    public void setBackgroundImage (String forStateNurmal, String forStateFocused, String forStateHightlighted) {
        onPicture = EncodedImage.getEncodedImageResource(forStateFocused);
        offPicture = EncodedImage.getEncodedImageResource(forStateNurmal);
        lightPicture = EncodedImage.getEncodedImageResource(forStateHightlighted);
        invalidate();
    }

    public void setState (int State) {
        state = State;
        switch (state) {
        case 0: {
            currentPicture = offPicture;
            invalidate();
            break;
        }
        case 1: {
            currentPicture = onPicture;
            invalidate();
            break;
        }
        case 2: {
            currentPicture = lightPicture;
            invalidate();
            break;
        }
        }
    }

    public void setTitleFont (Font Font) {
        font = Font;
        invalidate();
    }

    public void setTitleFontSize (int FontSize) {
        fontSize = FontSize;
        FontFamily ff = font.getFontFamily();
        font = ff.getFont(0, fontSize);
        invalidate();
    }

    public int getPreferredHeight() 
    {
        return height;
    }

    public int getPreferredWidth() 
    {
        return  width;
    }


    protected void onFocus(int direction) 
    {
        super.onFocus(direction);
        this.setState(0);
    }


    protected void onUnfocus() 
    {
        if (state!=2) this.setState(1);
    }


    protected void drawFocus(Graphics graphics, boolean on) 
    {
        super.drawFocus(graphics, on);
    }


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


    protected void paint(Graphics graphics) 
    {
        ResizeImage r = new ResizeImage();
        currentPicture = r.sizeImage(currentPicture, width-2, height-2);
        graphics.drawBitmap(1, 1, width-2, height-2, currentPicture.getBitmap(), 0, 0);
        if (title.getBytes().length>0) {

            graphics.setColor(color);
            graphics.setFont(font);

            int x = 0;
            if (horizontalAligment == DrawStyle.LEFT) x = 2;
            graphics.drawText(title, x, (height-font.getHeight())/2, 
                    (int)( getStyle() & DrawStyle.VCENTER & horizontalAligment | DrawStyle.HALIGN_MASK ), width );
        }
    }

    protected boolean navigationClick(int status, int time) 
    {
        fieldChangeNotify(1);
        return true;
    }

}

Ответы [ 3 ]

2 голосов
/ 10 декабря 2011

В Java очень строго принято называть локальные и полевые идентификаторы строчными буквами.Поэтому восприятие «Запись» в качестве имени локальной переменной весьма запутанно.


Без кода для пользовательского поля UIButton невозможно ответить на ваш вопрос здесь.Встроенные компоненты для BlackBerry OS будут работать корректно при такой последовательности добавления и установки, поэтому, скорее всего, ваше настраиваемое поле не соответствует соглашениям BlackBerry с макетом и рисованием.

1 голос
/ 12 декабря 2011

Вы забыли изменить currentPicture в setBackgroundImage ().Попробуйте currentPicture = offPicture или позвоните this.setState(0) в setBackgroundImage().

0 голосов
/ 10 декабря 2011

Если вы вызываете набор ** методов до , вы добавляете это поле в менеджер, и у вас не должно быть этой проблемы.Есть ли причина, по которой вы звоните им после?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...