BlackBerry-可用屏幕高度,不包括横幅和标题字段

问题描述

| 我想知道我的经理在屏幕上可以使用多少垂直不动产(无需滚动)。 我想让这个经理在一个单独的类中,而不是在Screen子类中。理想情况下,我的经理将可以放置在任何屏幕上,而无需将任何屏幕细节传递给它-该经理将能够找出屏幕标题/横幅剩余的空间领域。 我可以通过许多方法来获取屏幕尺寸。那是容易的部分。但是它没有考虑标题/横幅字段。 我想知道的是如何找到屏幕上未被标题或横幅字段覆盖的部分?但是我想有一个通用的解决方案,该解决方案可以在单独的类文件中使用,而无需事先知道要在其上显示屏幕。 (解决方法:我必须告诉我的经理标题/横幅字段的高度是多少,然后我可以使用这些高度加上
Display.getHeight()
来计算可用空间)     

解决方法

        我有一个单独的类(称为
CobiPainter
),可以由任何管理器或屏幕类使用-它实现了一种我称为
paintBackground(Graphics g)
的方法。我从要绘制背景的屏幕的任何相关“ 2”覆盖范围内调用此方法。 为了能够被任何
MainScreen
使用,并且减少了耦合和额外的工作,我做到了so1ѭ类可以计算可用的屏幕数量,而无需了解标题/横幅/状态字段。 我使用的代码依赖于这样的事实,即
MainScreen
具有一个内部管理器,我们通常向其中添加字段。这位经理知道我要寻找的身高。 这是我使用的hack /代码:
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()
方法。它还要求使用参数“ 10”创建“ 4”,以强制其采用屏幕尺寸(这要感谢Himanshu)。     ,        共有3种字段管理器,例如-VerticalFieldManager,Horizo​​ntalFieldManager和FlowFieldManager,可以使用“不可滚动”,“垂直”和“水平”设置。 您必须使用参数(Manager.NO_VERTICAL_SCROLL | Manager.NO_HORIZONTAL_SCROLL)为Horizo​​ntal / Vertical 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,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);
    ,        我要做的是一种解决系统无法提供该信息的方法。 1)扩展BaseScreen类中的所有屏幕。 2)在该类中设置横幅(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)在经理使用的受保护的void sublayout(int maxWidth,int maxHeight)内部:
int bannerHeight = ((BaseScreen) getScreen()).getBannerHeight();
int titleHeight  = getScreen().getTitleBar().getHeight() // TODO: protect from null
以我的经验,在必要时,我还会考虑虚拟键盘和管理器的填充。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...