问题描述
|
我想知道我的经理在屏幕上可以使用多少垂直不动产(无需滚动)。
我想让这个经理在一个单独的类中,而不是在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,HorizontalFieldManager和FlowFieldManager,可以使用“不可滚动”,“垂直”和“水平”设置。
您必须使用参数(Manager.NO_VERTICAL_SCROLL | Manager.NO_HORIZONTAL_SCROLL)为Horizontal / 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
以我的经验,在必要时,我还会考虑虚拟键盘和管理器的填充。