该ObjectChoiceField场满足我的所有要求,但它是不漂亮。
这是我有:
String pets[] = {"Dog", "Cat", "Duck" };
ObjectChoiceField dd = new ObjectChoiceField("My Pet",pets,0,ObjectChoiceField.FIELD_LEFT);
但我宁愿在下拉列表中的图片。 我的理解是,对象数组必须包含支持toString方法的对象。 有必须是一个办法做到我看到它在其他应用程序,我只是找不到在API中正确的对象。
它不必是一个ObjectChoiceField。
我会使用自定义ButtonField字段和PopupScreen。 有两个原因:
- 在移动的设计,最好有效地利用屏幕,经典的桌面下拉控制似乎比少弹出足够的,至少对于复杂的项目(图像+文字)
- 它更容易:)
替代文字http://img405.imageshack.us/img405/3746/dropdown.jpg
DropDownItem:
class DropdownItem {
Bitmap mBitmap;
String mName;
public DropdownItem(Bitmap bitmap, String name) {
this.mBitmap = bitmap;
this.mName = name;
}
}
自ButtonField字段:
class BitmapButtonField extends ButtonField {
protected DropdownItem mItem;
boolean mTextItem;
int mWidth;
int mHeight;
public BitmapButtonField(DropdownItem item, boolean textItem) {
super(CONSUME_CLICK);
mItem = item;
mTextItem = textItem;
mWidth = mItem.mBitmap.getWidth() + 6
+ (mTextItem ? getFont().getAdvance(mItem.mName) + 6 : 0);
mHeight = mItem.mBitmap.getHeight() + 6;
setMargin(0, 0, 0, 0);
setPadding(0, 0, 0, 0);
setBorder(BorderFactory.createSimpleBorder(new XYEdges(0, 0, 0, 0)));
setBorder(VISUAL_STATE_ACTIVE, BorderFactory
.createSimpleBorder(new XYEdges(0, 0, 0, 0)));
}
protected void paint(Graphics graphics) {
int color = (getVisualState() == VISUAL_STATE_FOCUS) ? Color.LIGHTGREY
: Color.DARKGRAY;
graphics.setColor(color);
graphics.drawRect(1, 1, mWidth - 2, mHeight - 2);
graphics.drawBitmap(3, 3, mItem.mBitmap.getWidth(), mItem.mBitmap
.getHeight(), mItem.mBitmap, 0, 0);
if (mTextItem)
graphics.drawText(mItem.mName, mItem.mBitmap.getWidth() + 6, 3);
}
public int getPreferredWidth() {
return mWidth;
}
public int getPreferredHeight() {
return mHeight;
}
protected void layout(int width, int height) {
setExtent(mWidth, mHeight);
}
}
下拉控件本身:
class DDImagesButton extends BitmapButtonField implements FieldChangeListener {
DropdownItem[] mItems;
int mIndex;
public DDImagesButton(DropdownItem[] items) {
super(items[0], false);
mItems = items;
updateIndex(0);
setChangeListener(this);
}
protected void paint(Graphics graphics) {
super.paint(graphics);
int x = mItems[mIndex].mBitmap.getWidth() + 2;
int y = 5;
int y1 = y;
int y2 = y + 10;
int x1 = x;
int x2 = x + 18;
int[] xPts = new int[] { x1, x2, x1 + 9 };
int[] yPts = new int[] { y1, y1, y2 };
graphics.drawFilledPath(xPts, yPts, null, null);
}
public void fieldChanged(Field field, int context) {
getScreen().getUiEngine().pushScreen(new DDImagesPopUp());
}
public void updateIndex(int index) {
mIndex = index;
mItem = mItems[mIndex];
mWidth = mItem.mBitmap.getWidth() + 6 + 18 + 3;
mHeight = mItem.mBitmap.getHeight() + 6;
invalidate();
}
class DDImagesPopUp extends PopupScreen implements FieldChangeListener {
public DDImagesPopUp() {
super(
new VerticalFieldManager(VERTICAL_SCROLL
| VERTICAL_SCROLLBAR));
for (int i = 0; i < mItems.length; i++) {
BitmapButtonField button = new BitmapButtonField(mItems[i],
true);
add(button);
button.setChangeListener(this);
}
setFieldWithFocus(getField(mIndex));
}
protected boolean keyChar(char key, int status, int time) {
if (Keypad.KEY_ESCAPE == key) {
this.close();
return true;
} else
return super.keyChar(key, status, time);
}
public void fieldChanged(Field field, int context) {
updateIndex(getFieldWithFocusIndex());
close();
}
}
}
使用的示例:
class Scr extends MainScreen {
DDImagesButton ddImages1;
DDImagesButton ddImages2;
public Scr() {
HorizontalFieldManager hfm = new HorizontalFieldManager();
add(hfm);
DropdownItem[] items = new DropdownItem[6];
items[0] = new DropdownItem(Bitmap.getBitmapResource("1.png"),
"Add Item");
items[1] = new DropdownItem(Bitmap.getBitmapResource("2.png"),
"Attachment");
items[2] = new DropdownItem(Bitmap.getBitmapResource("3.png"), "Time");
items[3] = new DropdownItem(Bitmap.getBitmapResource("4.png"), "User");
items[4] = new DropdownItem(Bitmap.getBitmapResource("5.png"), "Group");
items[5] = new DropdownItem(Bitmap.getBitmapResource("6.png"),
"Information");
ddImages1 = new DDImagesButton(items);
hfm.add(ddImages1);
ddImages2 = new DDImagesButton(items);
hfm.add(ddImages2);
}
}
我不熟悉黑莓的发展,但我想你可以继承ObjectChoiceField
并覆盖layout(int, int)
和paint(Graphics)
的方法。
然后在paint(Graphics)
可能使用drawImage(...)
的传入的Graphics对象绘制图像的方法。
只是胡乱猜测
我的答案是沿着线的抖动的响应 。 对于那种你想自定义的总体思路是覆盖的基本组件的默认行为。
假设,你要显示可以通过一个名为类封装的选择Choice
如下声明:
private class Choice
{
public Bitmap image;
public String label;
public Choice(String name)
{
this.image = Bitmap.getBitmapResource(name + ".png");
this.label = name;
}
public String toString()
{
return this.label;
}
}
那么你可以声明ObjectListField
实例为:
ObjectChoiceField choice = new ObjectChoiceField()
{
protected void paint(Graphics graphics)
{
// Get the current selected Choice
Choice item = (Choice) this.getChoice(getSelectedIndex());
int xOffset = 5; // 5 px padding on the left
graphics.drawBitmap(xOffset, 0,
item.image.getWidth(),
item.image.getHeight(),
item.image,
0, 0);
// Add text after the image and 10px padding.
xOffset += item.image.getWidth() + 10;
graphics.drawText(item.label, xOfffset, 0);
}
};
设置你的选择的项目,如:
choice.setChoices(new Choice[]{ new Choice("choice 1"), new Choice("choice 2")});
然后将其添加到您的Screen
(或FieldManager
您选择的)使用:
add(choice);
我一直无法覆盖实际选择弹出菜单中的项目。 这似乎调用toString()
您所选择的项目的方法。 这就是为什么我重写的默认实现toString()
在Choice
类,这样我们就可以显示在弹出的逻辑名。
如果这是一个java插件那么很可能你可以通过简单的HTML作为项目的选择字段中显示(或具有toString()返回简单的HTML)。 那么,如果是这样的话,你通过图像应该显示的图像的URL /相对路径。 据我所知,将在Swing至少工作,如...
“<html>的狗<IMG SRC =” dog.png “> </ HTML>”
(空格添加的代码预览会显示)
文章来源: How do you make a dropdown list that displays images to the user instead of text?