问题
I have prepared a very short test case (s. below) for my question.
On a button click I would like to display a list of strings in a new screen.
After the user selects one item in the list, the previous screen should be displayed again and the button label should be set to the selected string.
My 2 problems are:
- From inside the menu I don't know how to pop the currently displayed screen
- How to pass the selected item from one screen to another (assuming I don't want to introduce a public variable/method on the former screen as a workaround)
Please suggest the necessary changes for my 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?
}
};
}
Thank you! Alex
回答1:
Use a callback pattern:
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);
}
};
}
来源:https://stackoverflow.com/questions/5871362/blackberry-select-item-in-a-list-return-to-previous-screen