0

フォーカス前の状態ですそれはうまくいきます。

これが合焦状態。それはうまくいきます。

これはフォーカス後の状態です。画像が消える問題が発生しました。

右上では問題なく動作しますが、左上の画像に問題があります。

これが私のカスタム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);
}
}
4

1 に答える 1

0

これは、私が過去数週間に見たこのような2番目の問題です。

バックグラウンド

ソリューションを理解するには、まず、BlackBerryの基本的なUIクラスを理解する必要があります。

まず、クラスがありFieldます。AFieldは、通常のUIコンポーネントの基本クラスです。UIコンポーネントを最初から自分で作成する場合は、次のようにサブクラス化し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の作業を行っています(javadocsからの上記の強調表示された引用を参照してください)。したがって、を拡張する理由は実際にはありません。Aは、フィールドを作成し、すべてを水平に配置する場合に使用します。ただし、コードで明示的に行います。結局のところ、ロジックは基本クラスと競合しているように見えます。 Manager HorizontalFieldManagerHorizontalFieldManageradd()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);

もう1つの方法は、単純に実装せず、元のようsublayout()に拡張HorizontalFieldManagerしてから、子フィールドのマージンlong スタイルフラグを使用してレイアウトを制御することです。ただし、上記のソリューションでは2行のコードを変更するだけでよいので、今回はおそらくそれが最も簡単です。

その他の問題

また、コードとスクリーンショットで、[ダウンロード]ボタンが表示されないことに気づきました。すべてのpng画像の正確なサイズはわかりませんが、更新画像とダウンロード画像が同じサイズの場合、現在のロジックでは、ダウンロードボタンのすぐ上に更新ボタンを配置しています。そのため、ダウンロードボタンは非表示になっています。それはおそらくあなたが望むものではありませんか?

于 2012-07-06T07:19:18.573 に答える