PopUpScreen中的问题

时间:2012-03-19 15:26:01

标签: blackberry java-me

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

5 个答案:

答案 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());
}