从此代码中
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);
}
}
}
左侧有一个按钮newsbtn
,右侧有一个downloadbtn
。当newsbtn
重点关注时,我点击downloadbtn
,它不会提示Dialog
,但它会pushscreen
。如果我点击downloadbtn
,它会提示Dialog
而不是pushscreen
。
当两个按钮都不聚焦时,我点击按钮,按钮正在聚焦并执行预期。
我尝试对焦默认按钮ButtonField
,然后点击另一个字段,它正确执行。
我认为是custom_buttonfield
类问题。
这是我的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);
}
}
谁可以帮我编辑课程,以便按钮的* 焦点状态 不会影响该功能? *
答案 0 :(得分:0)
使用setFieldChangeListener
将执行所有操作。
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);
}
}
然而,当您点击或使用拨轮单击按钮时,会出现一个不好的事情,它会显示为蓝色。
答案 1 :(得分:0)
我知道你已经发布了答案,但我想提出另一种选择。尝试下载BlackBerry Advanced UI Samples。在许多有用的自定义Field
类中,几乎每个应用程序都需要这些类。
您拥有的Custom_ButtonField
课程中还没有很多代码,因此我建议您从高级用户界面示例中的BitmapButtonField
课程开始文件夹(在/src/com/samples/toolkit/ui/component
下)。
如果你需要添加一些颜色绘画代码,看起来你已经习惯了。
我认为关键是对于大多数Field
子类,您可能不应该覆盖 touchEvent()
方法。你可以,但它比大多数人想象的要复杂。这对于复杂的字段非常有用,其中触摸的确切坐标很重要,或者您正在处理自定义滑动手势。
如果您根本没有实施touchEvent()
方法,navigationClick()
或navigationUnClick()
中的代码可用于您想要的内容。
但是,我认为你走在了正确的轨道上。通常,您将拥有一个可重复使用的按钮类(如BitmapButtonField
),该按钮类在单击时不知道该怎么做。我通常让Manager
类注册FieldChangeListener
来点击按钮时执行某些操作。这就是您在高级用户界面示例中看到的内容:
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!");
}
});
BitmapButtonField
已经正确设置,可以处理触摸点击,也可以跟踪滚轮点击,而不会弄乱焦点状态。
尝试从那开始,看看这是否更好。祝你好运!