Unable to perform another button's function if

2019-08-30 13:43发布

问题:

From this code,

public class Custom_TopField extends Manager {
private Bitmap download = Config_GlobalFunction.Bitmap("btn_download.png");
private Bitmap downloadactive = Config_GlobalFunction
        .Bitmap("btn_download_active.png");
private Bitmap refresh = Config_GlobalFunction.Bitmap("icon_refresh.png");
private Bitmap refreshactive = Config_GlobalFunction
        .Bitmap("icon_refresh_active.png");
private Bitmap back = Config_GlobalFunction.Bitmap("btn_back.png");
private Bitmap backctive = Config_GlobalFunction
        .Bitmap("btn_back_active.png");
private Bitmap news = Config_GlobalFunction.Bitmap("icon_news.png");
private Bitmap newsactive = Config_GlobalFunction
        .Bitmap("icon_news_active.png");

private Custom_ButtonField downloadbtn, refreshbtn, backbtn, newsbtn;
private Custom_LabelField title;
private int left, right, fontsize;
private Database_Webservice webservice;

Custom_TopField(final MainScreen mainscreen, final int position,
        final int catsid, final String header, int left, int right) {
    super(Manager.USE_ALL_WIDTH | Manager.NO_VERTICAL_SCROLL
            | Manager.NO_HORIZONTAL_SCROLL);
    this.left = left;
    this.right = right;

    if (Display.getWidth() > 480)
        fontsize = 43;
    else if (Display.getWidth() < 481 && Display.getWidth() > 320)
        fontsize = 33;
    else
        fontsize = 23;

    webservice = new Database_Webservice();
    setBackground(Config_GlobalFunction.loadbackground(Display.getWidth()
            + "_" + "header_bar.png"));

    if (position != 0) {
        title = new Custom_LabelField(Config_GlobalFunction.maintitle,
                DrawStyle.ELLIPSIS | LabelField.USE_ALL_WIDTH
                        | DrawStyle.HCENTER | Field.FOCUSABLE, Color.WHITE) {
            protected boolean navigationClick(int status, int time) {
                Main.getUiApplication().pushScreen(
                        new Custom_LoadingScreen(1));
                Main.getUiApplication().invokeLater(new Runnable() {
                    public void run() {
                        Main.getUiApplication().pushScreen(
                                new Main_AllLatestNews(false));
                    }
                }, 1 * 1000, false);
                return true;
            }

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

                return true;
            }
        };

    } else {
        title = new Custom_LabelField(Config_GlobalFunction.maintitle,
                DrawStyle.ELLIPSIS | LabelField.USE_ALL_WIDTH
                        | DrawStyle.HCENTER, Color.WHITE);
    }
    title.setFont(Font.getDefault().derive(Font.BOLD, fontsize));
    add(title);

    if (left == 1) {
        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.UP)
                    Main.getUiApplication().pushScreen(
                            new Menu_PopupMenu(position));

                return true;
            }
        };

        add(newsbtn);
    } else if (left == 2) {
        backbtn = new Custom_ButtonField(back, backctive, backctive) {
            protected boolean navigationClick(int status, int time) {
                Main.getUiApplication().popScreen(mainscreen);
                return true;
            }

            protected boolean touchEvent(TouchEvent message) {
                int eventCode = message.getEvent();
                if (eventCode == TouchEvent.UP)
                    Main.getUiApplication().popScreen(mainscreen);
                return true;
            }
        };
        add(backbtn);
    }

    if (right == 1) {
        downloadbtn = new Custom_ButtonField(download, downloadactive,
                downloadactive) {
            protected boolean navigationClick(int status, int time) {
                if (Config_GlobalFunction
                        .Dialog(Config_GlobalFunction.alertdownload)) {
                    if (Config_GlobalFunction.isConnected()) {
                        webservice.UpdateAllCatNews();
                    } else
                        Config_GlobalFunction.Message(
                                Config_GlobalFunction.nowifi, 1);
                } else
                    Config_GlobalFunction.CloseDialog();
                return true;
            }

            protected boolean touchEvent(TouchEvent message) {
                int eventCode = message.getEvent();
                if (eventCode == TouchEvent.UP) {
                    if (Config_GlobalFunction
                            .Dialog(Config_GlobalFunction.alertdownload)) {
                        if (Config_GlobalFunction.isConnected()) {
                            webservice.UpdateAllCatNews();
                        } else
                            Config_GlobalFunction.Message(
                                    Config_GlobalFunction.nowifi, 1);
                    } else
                        Config_GlobalFunction.CloseDialog();
                }
                return true;
            }
        };
        add(downloadbtn);
    } else if (right == 2) {
        refreshbtn = new Custom_ButtonField(refresh, refreshactive,
                refreshactive) {
            protected boolean navigationClick(int status, int time) {
                if (Config_GlobalFunction.isConnected()) {
                    webservice
                            .refreshCatNewsindex(catsid, position, header);
                } else
                    Config_GlobalFunction.Message(
                            Config_GlobalFunction.nowifi, 1);
                return true;
            }

            protected boolean touchEvent(TouchEvent message) {
                int eventCode = message.getEvent();
                if (eventCode == TouchEvent.UP) {
                    if (Config_GlobalFunction.isConnected())
                        webservice.refreshCatNewsindex(catsid, position,
                                header);
                    else
                        Config_GlobalFunction.Message(
                                Config_GlobalFunction.nowifi, 1);
                }
                return true;
            }
        };
        add(refreshbtn);
    }
}
}

There is a button newsbtn at left and downloadbtn at right. When the newsbtn is focusing, I click on downloadbtn, it will not prompt Dialog but it will pushscreen. By right, if I click on downloadbtn, it will prompt Dialog instead of pushscreen.

When both button is unfocus, I click on the button, the button is focusing and performed expected.

I tried on focusing default button which is ButtonField, then I click another field, it perform correctly.

I think is the custom_buttonfield class problem.

Here is my Custom_FieldButton.

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);
}
}

Who can help me to edit the class so that the button's *focus state will not affect the function?*

回答1:

Use setFieldChangeListener will do for all action.

    if (position != 0) {
        title = new Custom_LabelField(Config_GlobalFunction.maintitle,
                DrawStyle.ELLIPSIS | LabelField.USE_ALL_WIDTH
                        | DrawStyle.HCENTER | Field.FOCUSABLE
                        | ButtonField.CONSUME_CLICK, Color.WHITE) {
            protected boolean navigationClick(int status, int time) {
                Main.getUiApplication().pushScreen(
                        new Custom_LoadingScreen(1));
                Main.getUiApplication().invokeLater(new Runnable() {
                    public void run() {
                        Main.getUiApplication().pushScreen(
                                new Main_AllLatestNews());
                    }
                }, 1 * 1000, false);
                return true;
            }
        };
    } else {
        title = new Custom_LabelField(Config_GlobalFunction.maintitle,
                DrawStyle.ELLIPSIS | LabelField.USE_ALL_WIDTH
                        | DrawStyle.HCENTER, Color.WHITE);
    }
    title.setFont(Font.getDefault().derive(Font.BOLD, fontsize));
    add(title);

    if (left == 1) {
        newsbtn = new Custom_ButtonField(news, newsactive, newsactive);
        newsbtn.setChangeListener(new FieldChangeListener() {
            public void fieldChanged(Field field, int context) {
                Main.getUiApplication().pushScreen(
                        new Menu_PopupMenu(position));
            }
        });
        add(newsbtn);
    } else if (left == 2) {
        backbtn = new Custom_ButtonField(back, backctive, backctive);
        backbtn.setChangeListener(new FieldChangeListener() {
            public void fieldChanged(Field field, int context) {
                Main.getUiApplication().popScreen(mainscreen);
            }
        });
        add(backbtn);
    }

    if (right == 1) {
        downloadbtn = new Custom_ButtonField(download, downloadactive,
                downloadactive);
        downloadbtn.setChangeListener(new FieldChangeListener() {
            public void fieldChanged(Field field, int context) {
                if (Config_GlobalFunction
                        .Dialog(Config_GlobalFunction.alertdownload)) {
                    if (Config_GlobalFunction.isConnected()) {
                        webservice.UpdateAllCatNews();
                    } else
                        Config_GlobalFunction.Message(
                                Config_GlobalFunction.nowifi, 1);
                } else
                    Config_GlobalFunction.CloseDialog();
            }
        });
        add(downloadbtn);
    } else if (right == 2) {
        refreshbtn = new Custom_ButtonField(refresh, refreshactive,
                refreshactive);
        refreshbtn.setChangeListener(new FieldChangeListener() {
            public void fieldChanged(Field field, int context) {
                if (Config_GlobalFunction.isConnected()) {
                    Config_GlobalFunction.Message(
                            Config_GlobalFunction.refreshing, 1);
                    webservice.UpdateMoreCatNews(catsid, position, header);
                } else
                    Config_GlobalFunction.Message(
                            Config_GlobalFunction.nowifi, 1);
            }
        });
        add(refreshbtn);
    }
}

However, there is a bad thing which is when you click or use trackwheel to click the button, it will appear blue color.



回答2:

I know you already posted an answer, but I wanted to suggest another option. Try downloading the BlackBerry Advanced UI Samples. In there are lots of useful custom Field classes, that do things almost every app needs.

More information here

The Custom_ButtonField class you have doesn't have a lot of code in it yet, so I might recommend starting with the BitmapButtonField class that's in the Advanced UI Samples folder (under /src/com/samples/toolkit/ui/component).

If you need to add some color painting code, it looks like you're already comfortable with that.

I think the key is that for most Field subclasses, you probably shouldn't override the touchEvent() method. You can, but it's trickier than most people think. That's mainly useful for complicated fields, where the exact coordinates of the touch are important, or you are handling custom swipe gestures.

If you just don't implement a touchEvent() method at all, the code in navigationClick() or navigationUnClick() can be used for what you want.

But, I think you're on the right track. In general, you will have a reusable button class (like BitmapButtonField) that doesn't know anything about what to do when it's clicked. I normally let a Manager class register a FieldChangeListener to do something when the buttons are clicked. That's what you'll see in the Advanced UI samples:

    BitmapButtonField one = new BitmapButtonField(
          Bitmap.getBitmapResource("button_back_normal.png"), 
          Bitmap.getBitmapResource("button_back_focus.png") );
    add(one);
    one.setChangeListener(new FieldChangeListener() {
        public void fieldChanged(Field f, int context) {
            Dialog.alert("Hello Button!");
        }
    });

The BitmapButtonField is already properly setup to handle touch clicks, and track wheel clicks, too, without messing up the focus state.

Try starting from that, and see if this works better. Good luck!