BlackBerry - 可用屏幕的高度,不包括banner&标题字段

时间:2011-05-30 09:40:46

标签: user-interface blackberry screen

我想知道我的经理在屏幕上可以使用多少垂直空间(不滚动)。

我想将这个经理放在一个单独的类中,而不是在Screen子类中。理想情况下,我的经理可以被放置在任何屏幕上,而不知道屏幕细节被传递给它 - 这位经理将能够找出屏幕标题/横幅字段未使用的空间。 / p>

我可以通过多种方法获得屏幕尺寸。这是容易的部分。但它没有考虑标题/横幅字段。

我想知道的是如何找到任何标题或横幅字段未涵盖的屏幕部分?但是我希望有一个通用的解决方案,可以在一个单独的类文件中使用,而不需要事先知道它将被显示在屏幕上。

(解决方法:我必须告诉我的经理标题/横幅字段的高度是什么,然后我可以使用这些高度,Display.getHeight()来计算可用空间)

3 个答案:

答案 0 :(得分:2)

我有一个单独的类(称为CobiPainter),它可以被任何管理器或屏幕类使用 - 它实现了一个我称之为paintBackground(Graphics g)的方法。我在屏幕的任何相关paintBackground(Graphics g)覆盖中调用此方法,我想要绘制其背景。

为了能够被任何MainScreen使用,只需最少的耦合&额外的工作,我已经做到这一点,以便CobiPainter类能够计算可用的屏幕数量,而无需了解标题/横幅/状态字段。

我使用的代码依赖于MainScreen有一个我们通常添加字段的内部管理器这一事实。这位经理知道我正在寻找的高度。

这是我使用的黑客/代码:

Screen activeScreen = UiApplication.getUiApplication().getActiveScreen();
if (activeScreen instanceof MainScreen)
{
    // get available height excluding banner / title
    XYRect xy = ((MainScreen) activeScreen).getMainManager()
        .getExtent();
    heightOfTitleAndBanner = xy.y;  // <---- can be useful too
    availableHeight = xy.height;    // <---- this is what I wanted
}

在显示相关经理之前,此代码无效,因为它依赖于调用getActiveScreen()方法。它还要求使用参数MainScreen创建Manager.NO_VERTICAL_SCROLL以强制它占用屏幕的大小(感谢Himanshu)。

答案 1 :(得分:0)

有三个fieldmanager,如VerticalFieldManager,Horizo​​ntalFieldManager和FlowFieldManager,可以使用Non-Scrollable,垂直和水平设置。 您必须使用参数(Manager.NO_VERTICAL_SCROLL | Manager.NO_HORIZONTAL_SCROLL)为水平/垂直FieldManager创建一个对象

但你必须自定义它以满足你的条件。

如果您想知道标题大小,只需在水平/垂直FieldManager中添加容器,并分别使用getPreferedHeight()和getPreferedWidth()获取其高度或宽度。

这是代码:

final LabelField field  = new LabelField("Himanshu")
        {
            protected void layout(int width, int height) 
            {
                super.layout(width, height);
//              setExtent(360, 50);
            };
            public int getPreferredHeight() 
            {
                return super.getPreferredHeight();
            }
        };
        final LabelField field1  = new LabelField("Himanshu")
        {
            protected void layout(int width, int height) 
            {
                super.layout(width, height);
//              setExtent(360, 50);
            };
            public int getPreferredHeight() 
            {
                return super.getPreferredHeight();
            }
        };
        setTitle(field);
        setStatus(field1);
        VerticalFieldManager fieldManager = new VerticalFieldManager(Manager.USE_ALL_WIDTH|Manager.NO_VERTICAL_SCROLL)
        {
            protected void sublayout(int maxWidth, int maxHeight) 
            {
                super.sublayout(maxWidth, maxHeight);
                this.setExtent(360, Display.getHeight()-(field.getPreferredHeight())-(field1.getPreferredHeight()));
            }
        };
        fieldManager.setBackground(BackgroundFactory.createSolidBackground(Color.BLUE));
        System.out.println("-------------"+field.getPreferredHeight());
        add(fieldManager);

答案 2 :(得分:0)

我所做的是一种系统无法提供该信息的解决方法。

1)从BaseScreen类扩​​展所有屏幕。 2)在该类中设置Banner(setBanner())存储您放入的横幅的实例。例如:

public abstract class BaseScreen extends MainScreen
{
    private StandardTitleBar titleBar;

    ...    // some initializer body, i.e. constructor
        titleBar = getStandardTitleBar();
        setBanner(titleBar);
    ...
}

3)在BaseScreen类

中公开设置横幅的高度/宽度
public int getBannerHeight()
{
    if (null == titleBar)
        return 0;
    else
        return titleBar.getHeight();
}

4)你的经理使用的protected void sublayout(int maxWidth,int maxHeight)内:

int bannerHeight = ((BaseScreen) getScreen()).getBannerHeight();
int titleHeight  = getScreen().getTitleBar().getHeight() // TODO: protect from null

根据我的经验,我还会在必要时考虑虚拟键盘和经理的填充。