我想知道我的经理在屏幕上可以使用多少垂直空间(不滚动)。
我想将这个经理放在一个单独的类中,而不是在Screen子类中。理想情况下,我的经理可以被放置在任何屏幕上,而不知道屏幕细节被传递给它 - 这位经理将能够找出屏幕标题/横幅字段未使用的空间。 / p>
我可以通过多种方法获得屏幕尺寸。这是容易的部分。但它没有考虑标题/横幅字段。
我想知道的是如何找到任何标题或横幅字段未涵盖的屏幕部分?但是我希望有一个通用的解决方案,可以在一个单独的类文件中使用,而不需要事先知道它将被显示在屏幕上。
(解决方法:我必须告诉我的经理标题/横幅字段的高度是什么,然后我可以使用这些高度,Display.getHeight()
来计算可用空间)
答案 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,HorizontalFieldManager和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
根据我的经验,我还会在必要时考虑虚拟键盘和经理的填充。