كيف يمكنك جعل القائمة المنسدلة التي يعرض صور المستخدم بدلا من النص ؟

StackOverflow https://stackoverflow.com/questions/1601887

سؤال

على 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(...) من مر في الرسومات وجوه لرسم الصورة.

ومجرد تخمين البرية

جوابي سوف يكون على غرار غضب استجابة.الفكرة العامة لهذا النوع من التخصيصات التي تريد أن تجاوز السلوك الافتراضي من المكونات الأساسية.

لنفترض الخيارات التي ترغب في عرض يمكن أن تكون مغلفة من قبل فئة اسمه 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 الدرجة حتى نتمكن من عرض منطقي الأسماء في هذا pop-up.

وإذا كانت هذه القطعة جافا ثم هي احتمالات يمكنك تمرير أتش تي أم أل بسيطة كعناصر لعرض في حقل اختيار (أو يكون toString () ترجع أتش تي أم أل بسيطة). ثم إذا كان هذا هو الحال وقمت بتمرير / مسار URL صورة النسبي يجب عرض الصورة. AFAIK التي من شأنها العمل في أرجوحة على الأقل، منها مثلا ...

" الكلب "

و(المساحات المضافة للرمز لتظهر في المعاينة)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top