黑莓:选择列表中的项目,返回上一屏幕

时间:2011-05-03 14:51:18

标签: blackberry screen mainscreen

我为我的问题准备了一个非常简短的测试用例(下面的)。

在按钮上单击我想在新屏幕中显示字符串列表。

用户在列表中选择一个项目后,应再次显示上一个屏幕,并将按钮标签设置为所选字符串。

screenshot

我的两个问题是:

  1. 从菜单内部我不知道如何弹出当前显示的屏幕
  2. 如何将所选项目从一个屏幕传递到另一个屏幕(假设我不想在前一个屏幕上引入公共变量/方法作为解决方法)
  3. 请为 src \ mypackage \ MyList.java 建议必要的更改:

    package mypackage;
    
    import java.util.*;
    import net.rim.device.api.collection.*;
    import net.rim.device.api.collection.util.*; 
    import net.rim.device.api.system.*;
    import net.rim.device.api.ui.*;
    import net.rim.device.api.ui.component.*;
    import net.rim.device.api.ui.container.*;
    import net.rim.device.api.ui.decor.*;
    import net.rim.device.api.util.*;
    import net.rim.device.internal.i18n.*;
    
    public class MyList extends UiApplication implements FieldChangeListener {
        MyScreen myScreen = new MyScreen();
    
        public static void main(String args[]) {
            MyList app = new MyList();
            app.enterEventDispatcher();
        }
    
        public MyList() {
            MainScreen titleScreen = new MainScreen();
            titleScreen.setTitle("Click the button:");
    
            // TODO change the label of this button (see below)
            ButtonField myButton = new ButtonField("Show the list", ButtonField.CONSUME_CLICK);
            myButton.setChangeListener(this);
            titleScreen.add(myButton);
    
            pushScreen(titleScreen);
        }
    
        public void fieldChanged(Field field, int context) {
            pushScreen(myScreen);
        }
    } 
    
    class MyScreen extends MainScreen {
        ObjectListField myList = new ObjectListField();
    
        public MyScreen() {
            setTitle("Select an item below:");
    
            myList.set(new String[] { "Item 1", "Item 2", "Item 3", "Item 4", }); 
            add(myList);
    
            addMenuItem(myMenu);
        }
    
        private final MenuItem myMenu = new MenuItem("Select item", 0, 0) {
            public void run() { 
                int index = myList.getSelectedIndex();
                if (index < 0)
                    return;
    
                String item = (String) myList.get(myList, index);
                Status.show("Selected: " + item);
    
                // TODO how to return to the previous screen here?
                // TODO how to call myButton.setLabel(item) here?
            }
        };
    }
    

    谢谢! 亚历

1 个答案:

答案 0 :(得分:0)

使用回调模式:

class TitleScreen extends MainScreen {

    private ButtonField myButton;

    public TitleScreen() {
        super();
        setTitle("Click the button:");

        // TODO change the label of this button (see below)
        myButton = new ButtonField("Show the list", ButtonField.CONSUME_CLICK);
        myButton.setChangeListener(new FieldChangeListener() {
            public void fieldChanged(Field field, int context) {
                OnItemSelectedCallback callback = 
                        new OnItemSelectedCallback() {
                    public void onItemSelected(String label) {
                         TitleScreen.this.onItemSelected(label);
                    }
                };
                MyScreen myScreen = new MyScreen(callback);
                UiApplication.getUiApplication().pushScreen(myScreen);
            }
        });
        add(myButton);
    }

    private void onItemSelected(String label) {
        // this will be called when a menu item is executed on the MyScreen
        // e.g. you can call smth like: myButton.setLabel(label);
    }
}

interface OnItemSelectedCallback {
    void onItemSelected(String label);
}

class MyScreen extends MainScreen {
    ObjectListField myList = new ObjectListField();

    private final OnItemSelectedCallback onItemSelectedCallback;

    public MyScreen(OnItemSelectedCallback onItemSelectedCallback) {
        setTitle("Select an item below:");

        this.onItemSelectedCallback = onItemSelectedCallback;

        myList.set(new String[] { "Item 1", "Item 2", "Item 3", "Item 4", }); 
        add(myList);

        addMenuItem(myMenu);
    }

    private final MenuItem myMenu = new MenuItem("Select item", 0, 0) {
        public void run() { 
            int index = myList.getSelectedIndex();
            if (index < 0)
                return;

            String item = (String) myList.get(myList, index);
            Status.show("Selected: " + item);

            // TODO how to return to the previous screen here?
            // TODO how to call myButton.setLabel(item) here?

            // notify the parent screen
            onItemSelectedCallback.onItemSelected(item);

            // close the current screen
            UiApplication.getUiApplication().popScreen(MyScreen.this);
        }
    };
}