我正在尝试创建一个按钮,在按下按钮时会显示一条消息,但无法使其生效。
这是我的按钮:
HorizontalFieldManager buttonManager =
new HorizontalFieldManager(ButtonField.FIELD_HCENTER);
messageButton = new ButtonField("Press me", ButtonField.CONSUME_CLICK);
messageButton.setChangeListener(this);
buttonManager.add(messageButton);
add(buttonManager);
以下是打印消息的方法:
public void fieldChanged(Field field, int context) {
if (field == messageButton) {
showMessage();
}
}
private void showMessage() {
Dialog.inform("The button was pressed");
}
我在showMessage()方法中做错了什么,或者在其他地方输入错误?
答案 0 :(得分:1)
// just paste this class and run
package mypackage;
import java.io.IOException;
import javax.microedition.media.MediaException;
import javax.microedition.media.Player;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.ButtonField;
import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.container.HorizontalFieldManager;
import net.rim.device.api.ui.container.MainScreen;
public final class MyScreen extends MainScreen
{
public MyScreen()
{
// Set the displayed title of the screen
HorizontalFieldManager horizontalFieldManager= new HorizontalFieldManager();
ButtonField buttonField= new ButtonField("click to show dialog",Field.FIELD_VCENTER);
horizontalFieldManager.add(buttonField);
buttonField.setChangeListener(buttonchangelisners);
add(horizontalFieldManager);
}
private FieldChangeListener buttonchangelisners= new FieldChangeListener() {
public void fieldChanged(Field field, int context) {
// TODO Auto-generated method stub
showDialog("show your message");
}
};
public void showDialog(final String message) {
UiApplication.getUiApplication().invokeLater(new Runnable() {
public void run() {
Dialog.alert(message);
}
});
}
}
答案 1 :(得分:0)
检查事件日志(Alt + LGLG),我怀疑你会看到有关在非事件线程上推送模式屏幕的错误。如果是这种情况,只需将showMessage
更改为
private void showMessage()
{
UiApplication.getUiApplication.invokeLater(new Runnable()
{
public void run()
{
Dialog.inform("The button was pressed");
}
});
}
答案 2 :(得分:0)
我认为问题可能是你传递给构造函数的标志CONSUME_CLICK
。如果你想用按钮做某事,那肯定不是你想要使用的标志。
除此之外,我建议不要将FieldChangeListener
用于字段。也许对于按钮是可以的,但对于其他组件,可能在布局期间没有用户交互的情况下调用fieldChanged
方法。这就是为什么你几乎总想过滤掉那些第二个参数(代码中的上下文)等于FieldChangeListener.PROGRAMMATIC
的调用。
更好的选择是覆盖navigationClick
,这也适用于触觉和常规屏幕。
答案 3 :(得分:0)
invokeLater仍然有用,因为在UI Engine操作链中的某个点调用了fieldChanged,并且在显示Dialog之前最好让它完成作业。我怀疑不使用invokeLater是问题的主要原因。
使用fieldChangeListener时,实际上需要CONSUME_CLICK,否则将调用上下文菜单。如果切换到在按钮字段中使用navigationClick,则可以返回true以实现相同的行为(尽管我更喜欢使用navigationUnclick)。