Blackberry: выберите элемент в списке, вернитесь к предыдущему экрану - PullRequest
0 голосов
/ 03 мая 2011

Я подготовил очень короткий тестовый пример (ы) ниже для моего вопроса.

При нажатии кнопки я хотел бы отобразить список строк на новом экране.

После того, как пользователь выберет один элемент в списке, предыдущий экран должен отобразиться снова, а метка кнопки должна быть установлена ​​на выбранную строку.

screenshot

Мои 2 проблемы:

  1. Изнутри меню я не знаю, как вывести на экран текущий отображаемый экран
  2. Как передать выбранный элемент с одного экрана на другой (при условии, что яне хочу вводить общедоступную переменную / метод на предыдущем экране в качестве обходного пути)

Пожалуйста, предложите необходимые изменения для моего 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?
        }
    };
}

Спасибо!Alex

1 Ответ

0 голосов
/ 03 мая 2011

Использовать шаблон обратного вызова:

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