Изображение исчезло после фокусировки

Это до состояния фокуса. Работает нормально.

Это на фокусировке государства. Работает нормально.

Это после состояния фокуса. Возникла проблема, когда изображение исчезло.

Это работает нормально для верхнего правого, но верхнее левое изображение имеет проблемы.

Вот мой обычай VerticalFieldManager:

public class Custom_TopField extends HorizontalFieldManager implements
    FieldChangeListener {

private Bitmap bg = Bitmap.getBitmapResource("header_bar.png");
private Bitmap download = Bitmap.getBitmapResource("btn_download.png");
private Bitmap downloadactive = Bitmap
        .getBitmapResource("btn_download_active.png");
private Bitmap refresh = Bitmap.getBitmapResource("icon_refresh.png");
private Bitmap refreshactive = Bitmap
        .getBitmapResource("icon_refresh_active.png");
private Bitmap back = Bitmap.getBitmapResource("btn_back.png");
private Bitmap backctive = Bitmap.getBitmapResource("btn_back_active.png");
private Bitmap news = Bitmap.getBitmapResource("icon_news.png");
private Bitmap newsactive = Bitmap
        .getBitmapResource("icon_news_active.png");

private Custom_ButtonField downloadbtn, refreshbtn, backbtn, newsbtn;
private Custom_LabelField title;

Custom_TopField(final MainScreen mainscreen) {
    Background background = BackgroundFactory.createBitmapBackground(bg);
    setBackground(background);
    title = new Custom_LabelField("东方日报", DrawStyle.ELLIPSIS
            | LabelField.USE_ALL_WIDTH | DrawStyle.HCENTER
            | Field.FOCUSABLE, Color.WHITE) {
        protected boolean navigationClick(int status, int time) {
            Main.getUiApplication().pushScreen(new Main_AllLatestNews());
            Main.getUiApplication().popScreen(mainscreen);
            return true;
        }
    };
    title.setFont(Font.getDefault().derive(Font.BOLD, 33));
    add(title);

    downloadbtn = new Custom_ButtonField(download, downloadactive,
            downloadactive);
    downloadbtn.setChangeListener(this);
    add(downloadbtn);

    refreshbtn = new Custom_ButtonField(refresh, refreshactive,
            refreshactive);
    refreshbtn.setChangeListener(this);
    add(refreshbtn);

    backbtn = new Custom_ButtonField(back, backctive, backctive);
    backbtn.setChangeListener(this);
    add(backbtn);

    /*newsbtn = new Custom_ButtonField(news, newsactive, newsactive);
    newsbtn.setChangeListener(this);
    add(newsbtn);*/
}

protected void sublayout(int width, int height) {
    Field field = getField(0);
    layoutChild(field, 120, Font.getDefault().getHeight());
    setPositionChild(field, (getPreferredWidth() - title.getWidth()) / 2,
            15);

    field = getField(1);
    layoutChild(field, download.getWidth(), download.getHeight());
    setPositionChild(field, getPreferredWidth()
            - (download.getWidth() + 10),
            getPreferredHeight() - (download.getHeight() + 5));

    field = getField(2);
    layoutChild(field, refresh.getWidth(), refresh.getHeight());
    setPositionChild(field,
            getPreferredWidth() - (refresh.getWidth() + 10),
            getPreferredHeight() - (refresh.getHeight() + 5));

    field = getField(3);
    layoutChild(field, back.getWidth(), back.getHeight());
    setPositionChild(field, 10, 5);

    /*field = getField(4);
    layoutChild(field, news.getWidth(), news.getHeight());
    setPositionChild(field, 10, 5);*/

    width = Math.min(width, getPreferredWidth());
    height = Math.min(height, getPreferredHeight());
    setExtent(width, height);
}

public int getPreferredHeight() {
    return 70;
}

public int getPreferredWidth() {
    return Display.getWidth();
}

public void paint(Graphics graphics) {
    int rectHeight = getPreferredHeight();
    int rectWidth = getPreferredWidth();

    graphics.drawRect(0, 0, rectWidth, rectHeight);
    super.paint(graphics);
}

public void fieldChanged(Field field, int context) {
    if (field == downloadbtn) {

    } else if (field == refreshbtn) {

    } else if (field == backbtn) {

    } else if (field == newsbtn) {

    }
}
}

Вот custom button field

public class Custom_ButtonField extends ButtonField {
Bitmap mNormal;
Bitmap mFocused;
Bitmap mActive;

int mWidth;
int mHeight;

private int color = -1;
String text;

public Custom_ButtonField(Bitmap normal, Bitmap focused, Bitmap active) {
    super(CONSUME_CLICK | Field.FOCUSABLE);
    mNormal = normal;
    mFocused = focused;
    mActive = active;
    mWidth = mNormal.getWidth();
    mHeight = mNormal.getHeight();
    setMargin(0, 0, 0, 0);
    setPadding(0, 0, 0, 0);
    setBorder(BorderFactory.createSimpleBorder(new XYEdges(0, 0, 0, 0)));
    setBorder(VISUAL_STATE_ACTIVE,
            BorderFactory.createSimpleBorder(new XYEdges(0, 0, 0, 0)));
}

public Custom_ButtonField(String text, Bitmap normal, Bitmap focused,
        Bitmap active, int color) {
    super(CONSUME_CLICK | Field.FOCUSABLE);
    this.color = color;
    mNormal = normal;
    mFocused = focused;
    mActive = active;
    mWidth = mNormal.getWidth();
    mHeight = mNormal.getHeight();
    setMargin(0, 0, 0, 0);
    setPadding(0, 0, 0, 0);
    setBorder(BorderFactory.createSimpleBorder(new XYEdges(0, 0, 0, 0)));
    setBorder(VISUAL_STATE_ACTIVE,
            BorderFactory.createSimpleBorder(new XYEdges(0, 0, 0, 0)));
    this.text = text;
}

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

protected void onUnfocus() {
    super.onUnfocus();
}

protected void paint(Graphics graphics) {
    Bitmap bitmap = null;
    switch (getVisualState()) {
    case VISUAL_STATE_NORMAL:
        bitmap = mNormal;
        break;
    case VISUAL_STATE_FOCUS:
        bitmap = mFocused;
        break;
    case VISUAL_STATE_ACTIVE:
        bitmap = mActive;
        break;
    default:
        bitmap = mNormal;
    }
    graphics.drawBitmap(0, 0, bitmap.getWidth(), bitmap.getHeight(),
            bitmap, 0, 0);
    graphics.setFont(Font.getDefault().derive(Font.BOLD, 25));
    graphics.setColor(color);
    graphics.drawText(text, (mNormal.getWidth() - Font.getDefault()
            .getAdvance(text)) / 2, ((mNormal.getHeight() - Font
            .getDefault().getHeight()) / 2) + 10, DrawStyle.HCENTER
            | DrawStyle.VCENTER);
}

public int getPreferredWidth() {
    return mWidth;
}

public int getPreferredHeight() {
    return mHeight;
}

protected void layout(int width, int height) {
    setExtent(mWidth, mHeight);
}
}

1 ответ

Решение

Это вторая проблема, которую я видел за последние пару недель.

Фон

Чтобы понять решение, сначала вы должны понять основные классы пользовательского интерфейса в BlackBerry.

Во-первых, у нас есть Field класс Field базовый класс нормальных компонентов пользовательского интерфейса. Если вы пишете компонент пользовательского интерфейса с нуля, то вы бы подкласс Field:

public class MyWidget extends Field {

Однако, если уже существует класс BlackBerry, который делает почти то, что вам нужно, и вам просто нужно немного изменить его поведение, то вы бы создали подкласс другого. Например:

public class MyButtonWidget extends ButtonField {

Та же картина существует для Manager класс Если вы пишете Manager с нуля, а затем расширить Manager:

public class MyManager extends Manager {

что включает в себя это, согласно документам BlackBerry:

Реализация собственного менеджера компоновки

Если у вас есть особые потребности, вы можете реализовать свой собственный менеджер. Расширьте класс Manager и реализуйте sublayout, getPreferredWidth и getPreferredHeight. Для эффективности вы можете при желании переопределить подкраску.

Однако, если существующий подкласс Manager уже выполняет большую часть того, что вам нужно, и вы просто хотите настроить его, то вы можете рассмотреть возможность расширения этого подкласса:

public class MyHorizontalManager extends HorizontalFieldManager {

В вашем случае ваш Custom_TopField выполняет всю необходимую работу для полной кастомизации Manager (см. выделенную цитату выше из Javadocs). Таким образом, на самом деле нет никаких оснований для расширения HorizontalFieldManager, HorizontalFieldManager используется, когда вы просто хотите add() ваши поля, и выложите их все горизонтально. Но вы делаете это явно в вашем sublayout() код. Оказывается, похоже, что ваша логика конкурирует с базовым классом.

Решение

Итак, что вы должны сделать, это просто расширить свой класс Manager:

public class Custom_TopField extends Manager implements FieldChangeListener {

Если вы сделаете это, вам нужно будет вызвать другой супер-конструктор. Примерно так (вы можете выбрать разные константы стиля в зависимости от ваших потребностей):

Custom_TopField(final MainScreen mainscreen) {
   super(Manager.USE_ALL_WIDTH | Manager.NO_VERTICAL_SCROLL | Manager.NO_HORIZONTAL_SCROLL);

Другой альтернативой будет просто не реализовывать sublayout(), расширить HorizontalFieldManager как у вас изначально, а затем управлять макетом с полями дочерних полей и long флаги стиля Но, поскольку решение, которое я дал выше, требует только изменения двух строк кода, это, вероятно, самый простой способ для вас в этот раз.

Другие проблемы

Я также заметил в вашем коде и на скриншотах, что кнопка " Скачать" не отображается. Я не знаю точный размер всех ваших изображений в формате png, но если размер изображений для обновления и загрузки одинаков, то ваша текущая логика просто размещает кнопку обновления прямо над кнопкой загрузки. Итак, кнопка загрузки скрыта. Это, вероятно, не то, что вы хотите?

Другие вопросы по тегам