Вот мой 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){
}
}
});
}
}
}