1

这是一个非常基本的事情,但我似乎无法找到答案搜索然后上网。

基本上我在Horizo​​ntalFieldManager 上显示两个相邻的EditField 时遇到问题。

我相信从我读过的内容来看,EditField 使用了它所在容器的最大宽度。考虑到这一点,我认为将 editFields 添加到单独的 VerticalFieldManagers 中,然后将它们添加到我的 Horizo​​ntalFieldManager 中会起作用。下面是我正在执行此操作的代码。但不幸的是,用户名显示正常,但密码字段无法显示。关于我做错了什么的任何想法?

            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);
4

2 回答 2

1

问题是 EditField 仍将尝试使用所有宽度,这导致 VerticalFieldManager 也使用可用的整个宽度,有效地推开密码字段。

我知道做这样的事情的唯一方法是创建明确地将其宽度设置为屏幕 50% 的类。有两种方法可以做到这一点:要么创建 EditField 和 PasswordEditField 的子类,要么创建 Horizo​​ntalFieldManager 的子类。前一个选项在不同平台上会更容易、更可靠,但需要两个类而不是一个。

为此,您需要创建 EditField 的子类并覆盖其layout方法,使其看起来像:

protected void layout(int maxWidth, int maxHeight) {
    super.layout(maxWidth, maxHeight);
    this.setExtent(Display.getWidth()/2, this.getHeight());
}

PasswordEditField 也是如此。

根据您希望它的行为方式,您可能还必须覆盖其他方法。例如,这段代码(我很确定,没有专门测试过)会导致任何额外的字符在不适合所需区域时被截断。如果这不是您想要的,您可能必须paint根据当前文本覆盖或更改布局。此外,您应该在倾斜风暴屏幕时对其进行测试以确保尺寸更新正确 - 它在大多数情况下应该可以工作,但是如果您在屏幕上有某些管理器配置,则会有一个错误导致它无法更新布局/尺寸。

如果您决定采用经理路线(同样,我不特别推荐,因为您可能会遇到更多问题),您将希望扩展 Manager 或 Horizo​​ntalFieldManager(前者可能更容易,因此您不必处理 HFM 的一些怪癖),并覆盖其sublayout方法。在此方法中,您需要为管理器中的每个字段(在您的情况下为用户字段和密码字段)调用layoutChild和(按此顺序)。setPositionChild然后,最后,您将要调用setExtent. 我会向您推荐有关此问题的黑莓文档,但老实说,您最好搜索如何实现黑莓自定义管理器,或询问有关 SO 的问题。

综上所述,您可能还想重新考虑为什么要这样做。我可以根据经验向您保证,会有一些手机的 UI 看起来不正确——我们曾经尝试过类似的方法,但最终放弃了它,因为从 UI 的角度来看,我们无法让它在所有设备上都能正常工作。有很多不同的分辨率——有些很窄,有些很宽——如果你使用这个用户界面,那么一些设备的登录会非常狭窄。恕我直言,最好与其他 BlackBerry 应用程序保持一致,并在不同的线路上有用户名和密码。

于 2011-06-20T06:23:58.480 回答
0

Horizo​​ntalFieldManager hfm = new Horizo​​ntalFieldManager();

       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);

试试这个代码。我将成为您问题的解决方案。

于 2014-04-09T19:25:14.067 回答