Issue in PopUpScreen

廉价感情. 提交于 2019-12-01 00:33:20

You should add an attribute to your PopUpScreen that references the Screen that launched the PopUp. That way, you can send parameters to the parent Screen without problems:

public class MyPopup extends PopupScreen {
    ObjectChoiceField ocf;
    MainScreen parentScreen;

    public MyPopup(MainScreen parentScreen) {
            this.parentScreen = parentScreen;
            ...

And when you launch the PopUp:

if(field==bitmapField1){
    UiApplication.getUiApplication().pushScreen(new MyPopup(this));
}

Here is my CustomChoiceField. Hope it helps:

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

On your PopUp screen ObjectChoiceField.... fieldChange() method..... call onClose() method.

protected boolean onClose(){
uiapplication.getUiapplication.popScreen(this);
return true;
}
rfsk2010

You can use a callback pattern to solve the problem you are facing . Check Blackberry: select item in a list, return to previous screen

Open Dialog in synchronized EventLock . You will get your solution...

synchronized (UiApplication.getUiApplication().getEventLock()) {
    //Open your dialog here......       
    UiApplication.getUiApplication().pushScreen(new MyPopup());
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!