Установить текст в центре экрана в кнопочном поле в 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();
}
};