OnClick of a image我正在弹出一个有下拉代码的屏幕,我必须选择数据并将其传递到弹出窗口的屏幕,从下拉列表中选择数据后弹出屏应该会消失传递选定的ocf值到第一个屏幕。选择后我无法隐藏弹出屏幕,无法将数据传回第一个屏幕
此代码将调用弹出屏幕
if (field==bitmapField1) {
UiApplication.getUiApplication().pushScreen(new MyPopup());
}
这是弹出的屏幕
public class MyPopup extends PopupScreen {
ObjectChoiceField ocf;
public MyPopup() {
super(new VerticalFieldManager(), Field.FOCUSABLE);
// this listener 'listens' for any event (see at the bottom)
FieldListener listener = new FieldListener();
TimeZone[] zone = TimeZoneUtilities.getAvailableTimeZones();
ocf = new ObjectChoiceField("Set Timezone", zone);
ocf.setChangeListener(listener);
add(ocf);
}
class FieldListener implements FieldChangeListener {
public void fieldChanged(Field f, int context) {
if (f == ocf) {
Object ob = ocf.getChoice(ocf.getSelectedIndex());
String str = ob.toString();
Dialog.alert(str);
}
}
}
}
答案 0 :(得分:1)
您应该向PopUpScreen添加一个属性,该属性引用启动PopUp的Screen。这样,您可以毫无问题地将参数发送到父屏幕:
public class MyPopup extends PopupScreen {
ObjectChoiceField ocf;
MainScreen parentScreen;
public MyPopup(MainScreen parentScreen) {
this.parentScreen = parentScreen;
...
当你启动PopUp时:
if(field==bitmapField1){
UiApplication.getUiApplication().pushScreen(new MyPopup(this));
}
答案 1 :(得分:1)
这是我的CustomChoiceField。希望它有所帮助:
public class ChoiceField extends HorizontalFieldManager{
protected boolean isEnabled = true;
protected String label;
protected Object[] choices;
protected int selectedIndex = -1;
protected ButtonField chooseField;
protected Font textFont = ClientConstants.Fonts.NORMAL;
protected PopUpList popup;
private FieldChangeListener fieldChangeListener;
public ChoiceField(final String label,Object[] choices){
this.label = label;
if (choices == null || choices.length == 0){
this.choices = new String []{};
setEnabled(false);
}else {
this.choices = choices;
}
chooseField = new ButtonField("Please Choose");
chooseField.setChangeListener(new FieldChangeListener() {
public void fieldChanged(Field field, int context) {
UiApplication.getUiApplication().invokeAndWait(new Runnable() {
public void run() {
if (isEnabled){
UiApplication.getUiApplication().pushScreen(popup);
}
}
});
}
});
chooseField.setPadding(0, 0, 0, Display.getWidth() - 20 - chooseField.getPreferredWidth());
popup = new PopUpList(this.choices);
add (chooseField);
}
public void setChoices(Object[] choices) {
if (choices == null || choices.length == 0){
this.choices = new String []{};
chooseField.setLabel("");
}else {
this.choices = choices;
chooseField.setLabel(this.choices[0].toString());
}
popup = new PopUpList(this.choices);
}
public void setChangeListener(FieldChangeListener fieldChangeListener){
this.fieldChangeListener = fieldChangeListener;
}
public void setEnabled (boolean isEnabled){
this.isEnabled = isEnabled;
}
public Object getSelectedItem () throws ChoiceFieldNotSelectedException{
if (selectedIndex == -1){
throw new ChoiceFieldNotSelectedException(label);
}
return choices[selectedIndex];
}
public void setSelectedObject(Object selectedObject){
for(int i=0;i<choices.length;i++)
if(choices[i].equals(selectedObject)){
selectedIndex = i;
break;
}
chooseField.setLabel(choices[selectedIndex].toString());
ChoiceField.this.invalidate();
}
protected void paint(Graphics graphics) {
if (label.length()>0){
graphics.setColor(Color.WHITE);
Font f = textFont;
while (f.getAdvance(label + ": ") > Display.getWidth() - 30 - chooseField.getPreferredWidth()){
if (f.getHeight() == 8){
break;
}
f = f.derive(f.getStyle(),f.getHeight()-1);
}
graphics.setFont(f);
graphics.drawText(label + ": ", 10, (chooseField.getHeight() - textFont.getHeight()) / 2);
}
super.paint(graphics);
}
class PopUpList extends PopupScreen{
private ObjectListField listField = null;
public PopUpList(final Object [] choices) {
super(new VerticalFieldManager(Manager.VERTICAL_SCROLL | Manager.VERTICAL_SCROLLBAR));
listField = new ObjectListField(choices.length){
protected void layout(int width, int height) {
super.layout(Math.min(width, getPreferredWidth()), height);
}
public int getPreferredWidth(ListField list) {
int width = 0;
for (int i=0;i<choices.length;i++){
if (width < textFont.getAdvance(choices[i].toString())){
width = textFont.getAdvance(choices[i].toString());
}
}
return width;
}
};
listField.setFont(textFont);
for (int i=0;i<choices.length;i++){
listField.insert(i, choices[i]);
}
add(listField);
}
protected boolean navigationClick(int status, int time) {
clicked();
closed();
return super.navigationClick(status, time);
}
protected boolean keyChar(char c, int status, int time) {
if (c == Characters.ENTER){
clicked();
closed();
}else if (c == Characters.ESCAPE){
closed();
}
return super.keyChar(c, status, time);
}
protected void clicked(){
try{
selectedIndex = listField.getSelectedIndex();
chooseField.setLabel(choices[selectedIndex].toString());
ChoiceField.this.invalidate();
if (fieldChangeListener != null){
fieldChangeListener.fieldChanged(ChoiceField.this, selectedIndex);
}
}catch (ArrayIndexOutOfBoundsException e) {
}
}
protected void closed(){
UiApplication.getUiApplication().invokeAndWait(new Runnable() {
public void run() {
try {
UiApplication.getUiApplication().popScreen(PopUpList.this);
}catch(Exception e){
}
}
});
}
}
}
答案 2 :(得分:1)
在你的PopUp屏幕上ObjectChoiceField .... fieldChange()方法.....调用onClose()方法。
protected boolean onClose(){
uiapplication.getUiapplication.popScreen(this);
return true;
}
答案 3 :(得分:0)
您可以使用回调模式来解决您所面临的问题。查看Blackberry: select item in a list, return to previous screen
答案 4 :(得分:0)
在synchronized EventLock
中打开对话框。
你会得到你的解决方案......
synchronized (UiApplication.getUiApplication().getEventLock()) {
//Open your dialog here......
UiApplication.getUiApplication().pushScreen(new MyPopup());
}