Проблема в PopUpScreen - PullRequest
       14

Проблема в PopUpScreen

3 голосов
/ 19 марта 2012

При нажатии на изображение я выскакиваю на экран с выпадающим кодом, где мне нужно выбрать данные и передать их на экран, с которого они выскочили, после выбора данных из выпадающего списка всплывающий экран должен исчезнутьвыбранное значение 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 ]

1 голос
/ 04 апреля 2012

На вашем всплывающем экране метод ObjectChoiceField .... fieldChange () ..... вызов метода onClose ().

protected boolean onClose(){
uiapplication.getUiapplication.popScreen(this);
return true;
}
1 голос
/ 21 марта 2012

Вот мой 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){
                    }
                }
            });
        }
    }
}
1 голос
/ 19 марта 2012

Вы должны добавить атрибут к вашему PopUpScreen, который ссылается на экран, который запустил всплывающее окно.Таким образом, вы можете отправлять параметры на родительский экран без проблем:

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));
}
0 голосов
/ 20 марта 2012

Открыть диалог в synchronized EventLock.Вы получите ваше решение ...

synchronized (UiApplication.getUiApplication().getEventLock()) {
    //Open your dialog here......       
    UiApplication.getUiApplication().pushScreen(new MyPopup());
}
0 голосов
/ 19 марта 2012

Вы можете использовать шаблон обратного вызова, чтобы решить проблему, с которой вы столкнулись. Отметьте Blackberry: выберите элемент в списке, вернитесь к предыдущему экрану

...