0

このようにメソッドをオーバーライドします。

        newsbtn = new Custom_ButtonField(news, newsactive, newsactive) {
            protected boolean navigationClick(int status, int time) {
                Main.getUiApplication().pushScreen(
                        new Menu_PopupMenu(position));
                return true;
            }

            protected boolean touchEvent(TouchEvent message) {
                int eventCode = message.getEvent();
                if (eventCode == TouchEvent.UNCLICK){
                    Main.getUiApplication().pushScreen(
                            new Menu_PopupMenu(position));
                }
                return true;
            }
        };

        add(newsbtn);

こちらがCustom_ButtonField

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 | Field.FIELD_HCENTER
            | Field.FIELD_VCENTER);
    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 | Field.FIELD_HCENTER
            | Field.FIELD_VCENTER);
    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;
}

public Custom_ButtonField(String text, Bitmap normal, Bitmap focused,
        Bitmap active, int color, long style) {
    super(style);
    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;
}

public void setText(String text){
    this.text = text;
    invalidate();
}

public String getText(){
    return text;
}

public void setColor(int color){
    this.color = color;
}

protected void onFocus(int direction) {     
    super.onFocus(direction);
    color = 0x540604;
    this.invalidate();
}

protected void onUnfocus() {
    super.onUnfocus();
    color = Color.WHITE;
    this.invalidate();
}

protected void paint(Graphics graphics) {
    int fontcontent;
    if (Display.getWidth() > 480)
        fontcontent = 28;
    else if (Display.getWidth() < 481 && Display.getWidth() > 320)
        fontcontent = 23;
    else
        fontcontent = 18;

    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;
    }
    setBackground(BackgroundFactory.createBitmapBackground(bitmap));
    graphics.setFont(Font.getDefault().derive(Font.PLAIN, fontcontent));
    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);
}
}

ただし、ボタンはプッシュスクリーンを実行できず、setfocus()ボタンのみです。

4

2 に答える 2

2

クリックを取得CONSUME_CLICKするためだけに、コンストラクター フィールドを使用する必要はありません。これにより、フィールドがクリック イベントを消費するかどうか、またはそれらを他のクラスに伝達して処理できるようにするかどうかが決まります。しかし、投稿者のコードは、彼の 2 つのクリック処理メソッドで既に返されています。これは、「このクリックは既に処理しています ... わざわざ他のクラスに渡さないでください」という意味でもあります。 詳細はこちらtrueField

そして、アランがコメントで言ったように、彼はすでに を使用していCONSUME_CLICKたので、それは間違いなく問題ではありません。

Custom_ButtonFieldクラスがここに投稿したものと同じである場合、コードを使用すると問題なくクリックを取得できます。ただし、潜在的な問題が 1 つあります。Java インポートは表示されません。あなたのTouchEventインポートはこのように見えますか?

import net.rim.device.api.ui.TouchEvent;

BlackBerry フレームワークには実際には別のTouchEventクラスがあり、間違ったクラスを使用した場合は、基本クラスを実際にオーバーライドしないメソッドを作成したことになりますtouchEvent()。Eclipse ショートカットを使用してインポートするのは簡単ですが、間違ったものを取得する可能性があります。

ただし、これを行うと、間違ったバージョンのtouchEvent()が呼び出されないという警告が Eclipse に表示されるはずです。

編集:ちなみに、私は通常、TouchEvent.UNCLICKではなくイベントでクリック処理コードをトリガーしますTouchEvent.CLICK。それがより良いUIにつながると思います。ユーザーの指が離されるまで、クリックは登録されません。しかし、それは些細なことであり、この問題の理由ではありません。

于 2012-07-23T13:19:03.277 に答える
0

Custom_ButtonField の親は何ですか?

ボタンフィールドの場合、コンストラクターで属性 CONSUME_CLICK を設定する必要があります

于 2012-07-23T12:06:47.747 に答える