Установить текст в центре экрана в кнопочном поле в Blackberry?

Я разработчик Android, разрабатываю приложение для Blackberry.

Я создал кнопку полной ширины экрана. Возникают проблемы с перемещением текста в центр области кнопок.

Используемый ниже код:

ButtonField _contactButton = new ButtonField(Constants.contactButtonTitle,Field.FIELD_HCENTER|Field.USE_ALL_WIDTH |
                Field.ACTION_INVOKE | Field.FOCUSABLE | ButtonField.CONSUME_CLICK){
            protected void layout(int width, int height) {
                super.layout(width, height);
                HARD_CODED_HEIGHT = this.getHeight()/2 + 6;
                this.setExtent(contactButtonWidth, HARD_CODED_HEIGHT);
            }
            public int getPreferredWidth() {
                return contactButtonWidth;
            }
        }; 

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

Теперь с помощью кода ниже:

ButtonField _contactButton = new ButtonField(Constants.contactButtonTitle,Field.FIELD_VCENTER|Field.USE_ALL_WIDTH |
                Field.ACTION_INVOKE | Field.FOCUSABLE | ButtonField.CONSUME_CLICK){
            protected void layout(int width, int height) {
                super.layout(getPreferredWidth(), height);
            }

            public int getPreferredWidth() {
                return (Display.getWidth()-60);
            }
        };

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

2 ответа

Решение

ButtonField выглядит немного "сломанным". Но он также, похоже, постоянно нарушается на всех уровнях ОС, которые я тестировал (от ОС 5.0 до ОС 7.1), поэтому я думаю, что мы можем достичь того, чего вы хотите, работая над разбитыми битами и быть уверенными, что обходной путь будет работать на всех уровнях ты хочешь.

Как уже было отмечено, ButtonField игнорирует USE_ALL_WIDTH, но учитывает предпочтительную ширину. Поэтому, если вы хотите установить ширину вашего ButtonField, просто переопределите getPreferredWidth(). Вы не должны ничего делать с шириной в макете.

Теперь вы уже используете стили для ButtonField. Учитывая, что мы отказались от USE_ALL_WIDTH в качестве полезного стиля, отмечу, что вы также используете FIELD_HCENTER. Вы должны знать, что на самом деле это директива для менеджера, который позиционирует это поле, - указание менеджеру разместить поле в центре ширины, доступной менеджеру. Этот стиль не относится к способу рисования содержимого ButtonField.

Для этого вы можете использовать DrawStyle. По умолчанию ButtonField использует DrawStyle.RIGHT. И это уважает DrawStyle.Left - текст будет нарисован слева. Однако это не относится к DrawStyle.HCENTER. Таким образом, чтобы получить центрированный текст, нам нужно нарисовать текст самостоятельно.

Есть еще одно осложнение. ButtonField передает область Context в метод paint(), а не на весь холст Field - предположительно, он не проходит по краям, потому что они закрашены рамкой. Таким образом, чтобы правильно отцентрировать текст, мы должны использовать область отсечения, которая была передана.

Вот последний, надеюсь, работающий, ButtonField. Я ценю, что вам придется потратить некоторое время на создание класса для этого, извините, я был ленив и сделал это "in-line". Пожалуйста, опубликуйте свой класс CenteredTextButtonField, если вы его создали....

final String buttonText = "Test";
ButtonField _contactButton = new ButtonField(" ",
        Field.ACTION_INVOKE | Field.FOCUSABLE | ButtonField.CONSUME_CLICK){
    public int getPreferredWidth() {
        return contactButtonWidth;
    }
    protected void paint(Graphics graphics) {
        super.paint(graphics);
        XYRect clippingRect = graphics.getClippingRect();
        int centreY = (clippingRect.height - graphics.getFont().getHeight()) / 2;
        graphics.drawText(buttonText, 0, centreY, DrawStyle.HCENTER, clippingRect.width);
    }
};

USE_ALL_WIDTH - наша инструкция к полю. Удивительно, но ButtonField игнорирует такие инструкции. Еще более удивительно, что он соблюдает свой собственный getPreferredWidth (как бы нелогично это ни звучало). Так что опустите USE_ALL_WIDTH и определите свой ButtonField следующим образом:

ButtonField testBtn = new ButtonField("Button") {
    public int getPreferredWidth() {
        return Display.getWidth();
    }
};
Другие вопросы по тегам