Blackberry меняет цвет дочерних полей в фокусе горизонтального менеджера

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


person Kumar    schedule 01.09.2009    source источник


Ответы (1)


Если вы используете версию 4.5 и ниже, расширьте HorizontalFieldManager, добавьте свойство цвета, используйте его в событии рисования и сделайте недействительным при изменении фокуса:

class Scr extends MainScreen {
 HorizontalFieldManager mMainPanel;
 VerticalFieldManager mVerticalPanel;

 public Scr() {
  mMainPanel = new HorizontalFieldManager();
  add(mMainPanel);

  mVerticalPanel = new VerticalFieldManager(USE_ALL_HEIGHT
    | USE_ALL_WIDTH);
  mMainPanel.add(mVerticalPanel);
  for (int i = 0; i < 5; i++) {
   HFMHighlight hfm = new HFMHighlight();
   hfm.setHightlightColor(Color.GRAY);
   hfm.add(new LabelField("Label " + i, FIELD_LEFT));
   hfm.add(new BasicEditField(FIELD_RIGHT));
   mVerticalPanel.add(hfm);
  }
 }
}

class HFMHighlight extends HorizontalFieldManager {

 int mHColor = -1;

 public void setHightlightColor(int color) {
  mHColor = color;
 }

 protected void onFocus(int direction) {
  invalidate();
  super.onFocus(direction);
 }

 protected void onUnfocus() {
  invalidate();
  super.onUnfocus();
 }

 public void paint(Graphics graphics) {
  if (-1 != mHColor && isFocus()) {
   graphics.setBackgroundColor(mHColor);
   graphics.clear();
  }
  super.paint(graphics);
 }
}

Если у вас версия 4.6 и выше, используйте setBackground для VISUAL STATE FOCUS:

class Scr extends MainScreen {
    HorizontalFieldManager mMainPanel;
    VerticalFieldManager mVerticalPanel;

    public Scr() {
        RadioInfo.isDataServiceOperational();
        CoverageInfo.isOutOfCoverage();
        WLANInfo.getWLANState();

        mMainPanel = new HorizontalFieldManager();
        add(mMainPanel);
        mVerticalPanel = new VerticalFieldManager(USE_ALL_HEIGHT
                | USE_ALL_WIDTH);
        mMainPanel.add(mVerticalPanel);
        for (int i = 0; i < 5; i++) {
            HFMHighlight hfm = new HFMHighlight(Color.GRAY);
            hfm.add(new LabelField("Label " + i, FIELD_LEFT));
            hfm.add(new BasicEditField(FIELD_RIGHT));
            mVerticalPanel.add(hfm);
        }
    }
}

class HFMHighlight extends HorizontalFieldManager {

    public HFMHighlight(int color) {
        Background focusedBG = BackgroundFactory.createSolidBackground(color);
        setBackground(VISUAL_STATE_FOCUS, focusedBG);
    }

    protected void onFocus(int direction) {
        invalidate();
        super.onFocus(direction);
    }

    protected void onUnfocus() {
        invalidate();
        super.onUnfocus();
    }
}

И вот случай, если вы хотите выделить все элементы управления (кнопку, флажок, выбор и редактирование), если горизонтальный менеджер сфокусирован:

class Scr extends MainScreen {
    HorizontalFieldManager mMainPanel;
    VerticalFieldManager mVerticalPanel;

    public Scr() {
        mMainPanel = new HorizontalFieldManager();
        add(mMainPanel);
        mVerticalPanel = new VerticalFieldManager(USE_ALL_HEIGHT
                | USE_ALL_WIDTH);
        mMainPanel.add(mVerticalPanel);
        for (int i = 0; i < 5; i++) {
            HHorizontalFieldManager hfm = new HHorizontalFieldManager();
            mVerticalPanel.add(hfm);
            HButtonField button = new HButtonField("btn");
            button.setHightlightColor(Color.GRAY);
            hfm.add(button);
            HCheckboxField checkbox = new HCheckboxField("chk box", false);
            checkbox.setHightlightColor(Color.GRAY);
            hfm.add(checkbox);
            String choiceItems[] = { "one", "two", "three" };
            HObjectChoiceField dropdown = new HObjectChoiceField("choice",
                    choiceItems);
            dropdown.setHightlightColor(Color.GRAY);
            hfm.add(dropdown);          
            HEditField edit = new HEditField("edit", "___");
            edit.setHightlightColor(Color.GRAY);
            hfm.add(edit);
        }
    }
}

class HHorizontalFieldManager extends HorizontalFieldManager {
    public HHorizontalFieldManager() {
        super();
    }

    public HHorizontalFieldManager(long style) {
        super(style);
    }

    protected void onFocus(int direction) {
        invalidate();
        super.onFocus(direction);
    }

    protected void onUnfocus() {
        invalidate();
        super.onUnfocus();
    }

    public void paint(Graphics graphics) {
        if (isFocus()) {
            graphics.setBackgroundColor(Color.GRAY);
            graphics.clear();
        }
        super.paint(graphics);
    }
}

class HEditField extends EditField {

    public HEditField() {
        super();
    }

    public HEditField(long style) {
        super(style);
    }

    public HEditField(String label, String initialValue, int maxNumChars,
            long style) {
        super(label, initialValue, maxNumChars, style);
    }

    public HEditField(String label, String initialValue) {
        super(label, initialValue);
    }

    private int mHColor = -1;

    public void setHightlightColor(int color) {
        mHColor = color;
    }

    protected void onFocus(int direction) {
        invalidate();
        super.onFocus(direction);
    }

    protected void onUnfocus() {
        invalidate();
        super.onUnfocus();
    }

    public void paint(Graphics graphics) {
        if (-1 != mHColor && getManager().isFocus()) {
            graphics.setBackgroundColor(mHColor);
            graphics.clear();
        }
        super.paint(graphics);
    }
}

class HButtonField extends ButtonField {

    public HButtonField() {
        super();
    }

    public HButtonField(long style) {
        super(style);
    }

    public HButtonField(String label, long style) {
        super(label, style);
    }

    public HButtonField(String label) {
        super(label);
    }

    private int mHColor = -1;

    public void setHightlightColor(int color) {
        mHColor = color;
    }

    protected void onFocus(int direction) {
        invalidate();
        super.onFocus(direction);
    }

    protected void onUnfocus() {
        invalidate();
        super.onUnfocus();
    }

    public void paint(Graphics graphics) {
        if (-1 != mHColor && getManager().isFocus()) {
            graphics.setBackgroundColor(mHColor);
            graphics.clear();
        }
        super.paint(graphics);
    }
}

class HCheckboxField extends CheckboxField {

    public HCheckboxField() {
        super();
    }

    public HCheckboxField(String label, boolean checked, long style) {
        super(label, checked, style);
    }

    public HCheckboxField(String label, boolean checked) {
        super(label, checked);
    }

    private int mHColor = -1;

    public void setHightlightColor(int color) {
        mHColor = color;
    }

    protected void onFocus(int direction) {
        invalidate();
        super.onFocus(direction);
    }

    protected void onUnfocus() {
        invalidate();
        super.onUnfocus();
    }

    public void paint(Graphics graphics) {
        if (-1 != mHColor && getManager().isFocus()) {
            graphics.setBackgroundColor(mHColor);
            graphics.clear();
        }
        super.paint(graphics);
    }
}

class HObjectChoiceField extends ObjectChoiceField {
    public HObjectChoiceField() {
        super();
    }

    public HObjectChoiceField(String label, Object[] choices, 
        int initialIndex, long style) {
        super(label, choices, initialIndex, style);
    }

    public HObjectChoiceField(String label, Object[] choices, 
            int initialIndex) {
        super(label, choices, initialIndex);
    }

    public HObjectChoiceField(String label, Object[] choices,
            Object initialObject) {
        super(label, choices, initialObject);
    }

    public HObjectChoiceField(String label, Object[] choices) {
        super(label, choices);
    }

    private int mHColor = -1;

    public void setHightlightColor(int color) {
        mHColor = color;
    }

    protected void onFocus(int direction) {
        invalidate();
        super.onFocus(direction);
    }

    protected void onUnfocus() {
        invalidate();
        super.onUnfocus();
    }

    public void paint(Graphics graphics) {
        if (-1 != mHColor && getManager().isFocus()) {
            graphics.setBackgroundColor(mHColor);
            graphics.clear();
        }
        super.paint(graphics);
    }
}
person Maksym Gontar    schedule 01.09.2009
comment
Привет, спасибо за помощь, но когда я использую свой код, я могу изменить только цвет горизонтального менеджера, цвет компонентов не меняется, я хочу изменить цвет всех компонентов, который также должен быть изменен при усилении фокуса на горизонтальном менеджере. - person Kumar; 01.09.2009
comment
Пожалуйста! Думаю, достаточно только менеджера по цвету. Но если вы хотите раскрасить каждое поле внутри, вам придется сказать мне, какие именно поля вы используете? Дело в том, что нам придется сделать то же, что и я, с каждым полем внутри менеджера. Поэтому нам придется реализовать собственный класс для каждого вида поля. - person Maksym Gontar; 01.09.2009
comment
Я использую поле редактирования, поле кнопки, поле раскрывающегося списка и поле флажка - это поля, которые я использовал в диспетчере. - person Kumar; 01.09.2009