Установите для поля изображения BlackBerry цвет фокуса (выделения)

Я разрабатываю приложение BlackBerry, которое использует диспетчер строк таблицы для создания представления таблицы. В своем приложении я добавил растровые поля в качестве фона строк, а затем синий цвет выделения полей по умолчанию исчез. Я прочитал несколько ответов в stackoverflow и реализовал этот код, чтобы попытаться выделить его цветом по умолчанию:

        //Adds background image
        final Bitmap bck; 
        bck = Bitmap.getBitmapResource("inner-back-stripe.jpg");
        BitmapField backgrnd = new BitmapField(bck,BitmapField.FOCUSABLE){
            protected void drawFocus(Graphics graphics, boolean on) 
            {
              setSpace(5, 5);
              super.drawFocus(graphics, on);
            } 

        };

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

Пример фона строки: введите описание изображения здесь

Здесь я вставляю весь код, который использовал

public class LeaveDetails extends ListField implements ListFieldCallback  {

    TableRowManager row;
    Vector rows;
    private String[] arrdNames = {"Udith","Mohammadu","Rajaram","David"};
    private String[] arrDate = {"12-Jan-2013","17-Feb-2013","20-Mar-2013","14-May-2013"};
    private String[] arrType = {"Medical Leave","Annual Leave","Medical Leave","Annual Leave"};
    private int[] arrCount = {3,5,2,6};

    public LeaveDetails(){
        super(0, ListField.MULTI_SELECT);
        setRowHeight(100);
        setEmptyString("", DrawStyle.HCENTER);
        setCallback(this);
        rows = new Vector();

        for (int x = 0; x < 4; x++) {
            row = new TableRowManager();
            //Adds background image
            final Bitmap bck;
            bck = Bitmap.getBitmapResource("inner-back-stripe.jpg");
            BitmapField backgrnd = new BitmapField(bck,BitmapField.FOCUSABLE){
                protected void drawFocus(Graphics graphics, boolean on)
                {
                    setSpace(5, 5);
                    super.drawFocus(graphics, on);
                }
            };
            row.add(backgrnd);

            //BitmapField backgrnd = new BitmapField(Bitmap.getBitmapResource("inner-back-stripe.jpg"),Field.FOCUSABLE);
            //row.add(backgrnd); //Field 0

            //Adds names
            LabelField lfName = new LabelField(String.valueOf(arrdNames[x]),FIELD_HCENTER);
            lfName.setFont(lfName.getFont().derive(Font.BOLD,30));
            row.add(lfName);//Field 1

            //Adds date
            LabelField date = new LabelField("Applied on : "+arrDate[x]);
            row.add(date);//Field 2

            //Adds type
            LabelField type = new LabelField("Leave type : "+arrType[x]);
            row.add(type);//Field 3

            //Adds duration in numbers
            LabelField lfCountNotifications = new LabelField(String.valueOf(arrCount[x]),FIELD_HCENTER);
            lfCountNotifications.setFont(lfCountNotifications.getFont().derive(Font.BOLD,72));
            row.add(lfCountNotifications);//Field 4

            //Adds word "Duration"
            LabelField lfNewNotification = new LabelField("Duration/Days",Field.FIELD_HCENTER);
            lfNewNotification.setFont(lfNewNotification.getFont().derive(Font.GEORGIAN_SCRIPT,30));
            row.add(lfNewNotification);//Field 5

            //Adds right arrow image
            BitmapField showMore = new BitmapField(Bitmap.getBitmapResource("more.png"));
            row.add(showMore);//Field 6

            //Adds rows to the table
            rows.addElement(row);
        }//End of the for loop
        setSize(rows.size());
    }

    // ListFieldCallback Implementation
    public void drawListRow(ListField listField, Graphics g, int index, int y,int width) {
        LeaveDetails list = (LeaveDetails) listField;
        TableRowManager rowManager = (TableRowManager) list.rows.elementAt(index);
        rowManager.drawRow(g, 0, y, width, list.getRowHeight());
    }

    //Tracks field click event
    protected boolean trackwheelClick(int status, int time)
    {
        int index = getSelectedIndex();
        switch (index) {
            case 0: Dialog.inform(index+" Clicked");
            break;
            case 1: Dialog.inform(index+" Clicked");
            break;
            case 2: Dialog.inform(index+" Clicked");
            break;
            case 3: Dialog.inform(index+" Clicked");
            break;
            default: Dialog.inform("Error!");
            break;
        }
        return true;
    }

    private class TableRowManager extends Manager {
        public TableRowManager() {
            super(0);
        }

        // Causes the fields within this row manager to be layed out then
        // painted.
        public void drawRow(Graphics g, int x, int y, int width, int height) {
            // Arrange the cell fields within this row manager.
            layout(width, height);
            // Place this row manager within its enclosing list.
            setPosition(x, y);
            // Apply a translating/clipping transformation to the graphics
            // context so that this row paints in the right area.
            g.pushRegion(getExtent());
            // Paint this manager's controlled fields.
            subpaint(g);
            // Restore the graphics context.
            g.popContext();
        }

        // Arrages this manager's controlled fields from left to right within
        // the enclosing table's columns.
        protected void sublayout(int width, int height) {
            // set the size and position of each field.
            int fontHeight = Font.getDefault().getHeight();
            int preferredWidth = getPreferredWidth();

            //Field background image
            Field field = getField(0);
            layoutChild(field, 640, 166);
            setPositionChild(field, 0, 0);

            // Name
            field = getField(1);
            layoutChild(field, 640, fontHeight+4);
            setPositionChild(field, 0, 5);

            // Date
            field = getField(2);
            layoutChild(field, 500, fontHeight+4);
            setPositionChild(field, 0, 30);

            //Type
            field = getField(3);
            layoutChild(field, 500, fontHeight+1);
            setPositionChild(field, 0, 60/*fontHeight+6*/);

            //Duration number
            field = getField(4);
            layoutChild(field, 100, 100);
            setPositionChild(field, 450, 5);

            //"Duration" word
            field = getField(5);
            layoutChild(field, 300, 100);
            setPositionChild(field, 400, 62);

            //More image
            field = getField(6);
            layoutChild(field, 100, 100);
            setPositionChild(field, 575, 20);

            setExtent(preferredWidth, getPreferredHeight());
        }

        // The preferred width of a row is defined by the list renderer.
        public int getPreferredWidth() {
            return 640;
        }

        // The preferred height of a row is the "row height" as defined in the
        // enclosing list.
        public int getPreferredHeight() {
            return getRowHeight();
        }
    }

    public Object get(ListField listField, int index) {
        return null;
    }

    public int getPreferredWidth(ListField listField) {
        return 0;
    }

    public int indexOfList(ListField listField, String prefix, int start) {
        return 0;
    }
}

Есть ли у кого-нибудь представление о том, что здесь произошло? Я хочу, чтобы он выделялся синим цветом по умолчанию. Я новичок в BlackBerry.


comment
Пожалуйста помоги. Я здесь застрял :(   -  person Grant    schedule 14.05.2013
comment
Должен ли фон вашей строки быть растровым полем? Судя по вашей картинке, это просто сплошной цвет. Это правда?   -  person Nate    schedule 14.05.2013
comment
Да, мне нужно добавить изображение для фона строки   -  person Grant    schedule 14.05.2013
comment
Есть какой-либо способ сделать это ??   -  person Grant    schedule 14.05.2013
comment
Вы можете объяснить почему? Опять же, на мой взгляд, это выглядит как сплошной цвет. Если это сплошной цвет, то есть способ получше.   -  person Nate    schedule 14.05.2013
comment
Да, это сплошное цветное изображение. Я добавил его, потому что хочу установить цвет фона строки.   -  person Grant    schedule 14.05.2013


Ответы (1)


Я думаю, проблема здесь в том, что ваш код использует BitmapField для создания фона. Я бы предложил пару других способов сделать это, которые решат вашу проблему с фокусом строки.

1. Если фон должен быть растровым

Иногда это необходимо. Если у вас сложный дизайн фона или специальный градиент, вам может понадобиться фоновое изображение. Для этого я бы все равно удалил ваш BitmapField. Итак, удалите этот код:

    final Bitmap bck; 
    bck = Bitmap.getBitmapResource("inner-back-stripe.jpg");
    BitmapField backgrnd = new BitmapField(bck,BitmapField.FOCUSABLE){

не вызывайте add(backgrnd), а затем в своем sublayout() методе удалите это:

    Field field = getField(0);  
    layoutChild(field, 640, 166);  
    setPositionChild(field, 0, 0);  

и, наконец, не забудьте изменить значения индекса поля в методе sublayout(), который размещает другие поля (индекс 1-6 -> 0-5).

Затем создайте свой растровый фон с одной дополнительной строкой кода в конструкторе вашего списка:

   public LeaveDetails(){
      super(0, ListField.MULTI_SELECT);
      setRowHeight(100);
      setEmptyString("", DrawStyle.HCENTER);
      setCallback(this);

      setBackground(BackgroundFactory.createBitmapBackground(Bitmap.getBitmapResource("inner-back-stripe.jpg")));

Теперь это создаст фон для всего ListField, а не только для одной строки. Но в вашем случае это должно сработать, так как ваш фон сплошного зеленого цвета.

2. Полное исключение растровых изображений

В вашей ситуации я бы вообще не рекомендовал растровое изображение. Вы используете дополнительное пространство в своем приложении и, вероятно, снижаете производительность (немного) из-за использования растрового изображения, когда все, что вам нужно, - это сплошной цветной фон. Итак, удалите код, который я сказал вам удалить выше, и вместо вызова setBackground(), который я показал в последнем фрагменте кода, используйте это:

   public LeaveDetails(){
      super(0, ListField.MULTI_SELECT);
      setRowHeight(100);
      setEmptyString("", DrawStyle.HCENTER);
      setCallback(this);

      setBackground(BackgroundFactory.createSolidBackground(0xBDCE66));

0xBDCE66 выглядит как шестнадцатеричный цветовой код зеленого цвета, который вы указали в своем вопросе.

Разделители строк

В исходном вопросе вы также показали белые разделительные полосы между строками. Мои первые два решения вам этого не дадут. Но вы можете легко добавить разделители к любому из них, добавив несколько строк в метод drawListRow():

public void drawListRow(ListField listField, Graphics g, int index, int y,int width) {
      LeaveDetails list = (LeaveDetails) listField;
      TableRowManager rowManager = (TableRowManager) list.rows
            .elementAt(index);
      rowManager.drawRow(g, 0, y, width, list.getRowHeight());

      // draw a separator of a given color (e.g. white)
      int oldColor = g.getColor();
      g.setColor(Color.WHITE);
      int h = getRowHeight();
      //g.drawLine(0, y+h-1, width, y+h-1);   // for 1 pixel thick line
      g.fillRect(0, y+h-3, width, 3);         // for 3 pixel thick "line"
      g.setColor(oldColor);
}

Результаты

введите описание изображения здесь

Примечание. правая часть каждой строки скрыта, потому что я тестировал это на экране шириной 360 пикселей, и в вашем коде жестко указаны местоположения полей. Итак, они не в правой части экрана. Однако это не имеет ничего общего с проблемой выделения фокуса.

person Nate    schedule 14.05.2013