0

我是一名 Android 开发人员,正在开发一个黑莓应用程序。

我创建了一个全屏宽度的按钮。将文本移动到按钮区域的中心时遇到问题。

使用以下代码:

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);
            }
        };

仍然遇到问题..我的按钮文本与右角对齐。请建议

4

2 回答 2

1

ButtonField 似乎有点“坏”。但在我测试过的所有操作系统级别(OS 5.0 到 OS 7.1)中,它似乎也一直被破坏,所以我认为我们可以通过解决损坏的位来实现你想要的,并相信解决方法将适用于所有级别你要。

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

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

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

还有一种复杂情况。ButtonField 将 Context 区域传递给它的 paint() 方法,而不是完整的 Field 画布 - 大概它不会传递到边缘,因为它们是由边框绘制的。因此,为了使文本适当居中,我们必须使用已传入的剪切区域。

这是最终的,希望能正常工作的 ButtonField。我很感激您将不得不花一些时间为此创建一个课程,对不起,我一直很懒惰并在“在线”中完成了它。如果您创建一个,请发布您的 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);
    }
};
于 2014-03-28T10:49:06.907 回答
0

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

ButtonField testBtn = new ButtonField("Button") {
    public int getPreferredWidth() {
        return Display.getWidth();
    }
};
于 2014-03-27T17:46:19.947 回答