在Blackberry的Button Field中将文本设置在屏幕中央?

时间:2014-03-27 11:29:36

标签: blackberry text-align buttonfield

我是一名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;
            }
        }; 

enter image description here

现在使用以下代码:

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 个答案:

答案 0 :(得分:1)

ButtonField似乎有点“破碎”了。但是在我测试的所有操作系统级别(OS 5.0到OS 7.1)中它似乎也一直被打破,所以我认为我们可以通过绕过破碎的位来实现你想要的,并确信解决方法可以在所有级别工作你要。

如前所述,ButtonField忽略USE_ALL_WIDTH,但确实尊重preferredWidth。因此,如果要设置ButtonField的宽度,则只需覆盖getPreferredWidth()。你不应该在布局中做任何宽度的事情。

现在您已经使用了ButtonField的样式。鉴于我们已将USE_ALL_WIDTH作为有用样式丢弃,我注意到您还使用了FIELD_HCENTER。您应该知道这实际上是管理器定位此字段的指令 - 告诉管理器将字段放置在Manager可用宽度的中心。此样式与如何绘制ButtonField的内容无关。

为此,您可以使用DrawStyle。默认情况下,ButtonField使用DrawStyle.RIGHT。它尊重DrawStyle.Left - 文本将在左侧绘制。但是,它并不尊重DrawStyle.HCENTER。因此,要获得居中文本,我们需要自己绘制文本。

还有一个并发症。 ButtonField将一个Context区域传递给它的paint()方法,而不是完整的Field画布 - 可能它不会在边缘传递,因为它们是由边框绘制的。因此,为了使文本适当居中,我们必须使用已传入的剪切区域。

这是最终的,希望有效的ButtonField。我很感激你将不得不花一些时间为此创建一个课程,对不起,我已经很懒惰并且已经完成了它的在线工作#39;如果你创建一个....请发布你的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);
    }
};

答案 1 :(得分:0)

USE_ALL_WIDTH是我们对该领域的指示。令人惊讶的是,ButtonField忽略了这些指令。更令人惊讶的是,它尊重自己的getPreferredWidth(听起来不合逻辑)。 因此,请删除USE_ALL_WIDTH并定义您的ButtonField,如下所示:

ButtonField testBtn = new ButtonField("Button") {
    public int getPreferredWidth() {
        return Display.getWidth();
    }
};