这是一个非常基本的事情,但我似乎找不到搜索网络的答案。
基本上我在HorizontalFieldManager上显示两个彼此相邻的EditField时遇到问题。
我相信我读过的EditField使用它所在的容器的最大宽度。考虑到这一点,我想添加editFields来分离VerticalFieldManagers,然后将这些添加到我的HorizontalFieldManager就行了。以下是我正在执行此操作的代码。但不幸的是,userName显示正常,但密码字段无法解除。关于我做错什么的任何想法?
HorizontalFieldManager hfm = new HorizontalFieldManager(Manager.USE_ALL_WIDTH));
VerticalFieldManager vfmUser = new VerticalFieldManager();
VerticalFieldManager vfmPassw = new VerticalFieldManager(;
userName = new EditField("Username:", "", 5, EditField.FIELD_LEFT);
password = new PasswordEditField("Pass: ", "", 5, PasswordEditField.FIELD_RIGHT);
vfmUser.add(userName);
vfmPassw.add(password);
hfm.add(vfmUser);
hfm.add(vfmPassw);
add(hfm);
答案 0 :(得分:1)
问题是EditField仍会尝试使用所有宽度,这会导致VerticalFieldManager也使用可用的整个宽度,从而有效地推断密码字段。
我知道做这样的事情的唯一方法是创建明确将其宽度设置为屏幕的50%的类。有两种方法可以:创建EditField和PasswordEditField的子类,或者创建HorizontalFieldManager的子类。前一个选项在不同平台上更容易,更可靠,但需要两个类而不是一个。
为此,您需要创建EditField的子类并覆盖其layout
方法,如下所示:
protected void layout(int maxWidth, int maxHeight) {
super.layout(maxWidth, maxHeight);
this.setExtent(Display.getWidth()/2, this.getHeight());
}
同样适用于PasswordEditField。
根据您的行为方式,您可能还必须覆盖其他方法。例如,这个代码将(我很确定,没有特别测试)导致任何额外的字符被截断,如果它们不适合所需的区域。如果这不是您想要的,您可能必须覆盖paint
或根据当前文本更改布局。此外,您应该在倾斜风暴屏幕时对其进行测试以确保大小正确更新 - 它应该在大多数情况下都有效,但如果您在屏幕上有某些管理器配置,则会出现导致其无法更新布局/大小的错误。
如果你决定去经理路线(我再也不特别推荐,因为你可能会遇到更多问题),你会想要扩展Manager或HorizontalFieldManager(可能更容易做前者,所以你不必处理HFM的一些怪癖,并覆盖它的sublayout
方法。在此方法中,您需要为管理器中的每个字段调用layoutChild
和setPositionChild
(按此顺序)(在您的情况下,用户字段和密码字段)。然后,最后,您需要拨打setExtent
。我会在这个问题上向你推荐黑莓文档,但老实说,你最好不要寻找如何实施黑莓自定义管理器,或者在SO上提问。
所有这一切,您可能还想重新考虑为什么要这样做。我可以从经验中保证,有些手机的UI看起来不对 - 我们尝试了一次类似的方法,并最终取消了它,因为我们无法在所有设备上从UI角度开始工作。有lots of different resolutions - 一些非常狭窄,一些非常宽 - 如果你使用这个UI,那么一些设备将拥有非常狭窄的登录。恕我直言,最好与其他BlackBerry应用程序保持一致,并在不同的行上有用户名和密码。
答案 1 :(得分:0)
HorizontalFieldManager hfm = new HorizontalFieldManager();
userName = new EditField("Username:", "", 5, EditField.FIELD_LEFT)
{
protected void layout(int maxWidth, int maxHeight) {
super.layout(maxWidth, maxHeight);
this.setExtent(Display.getWidth()/2, this.getHeight());
}
}
;
password = new PasswordEditField("Pass: ", "", 5, PasswordEditField.FIELD_RIGHT)
{
protected void layout(int maxWidth, int maxHeight) {
super.layout(maxWidth, maxHeight);
this.setExtent(Display.getWidth()/2, this.getHeight());
}
};
hfm.add(userName);
hfm.add(password);
add(hfm);
试试这段代码。我会解决你的问题。