【问题标题】:Blackberry and Editfields黑莓和 Editfields
【发布时间】:2014-04-10 03:25:14
【问题描述】:

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

基本上我在 Horizo​​ntalFieldManager 上显示两个 EditFields 时遇到问题。

我相信从我读过的内容来看,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);

【问题讨论】:

  • 为什么在同一行添加两个 EditField 不是一个好习惯。

标签: blackberry blackberry-jde blackberry-editfield


【解决方案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 方法。在此方法中,您需要为管理器中的每个字段(在您的情况下为用户字段和密码字段)调用layoutChildsetPositionChild(按此顺序)。然后,最后,您需要致电setExtent。我会向您推荐有关此问题的黑莓文档,但老实说,您最好搜索如何实现黑莓自定义管理器,或者就 SO 提出问题。

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

【讨论】:

    【解决方案2】:

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

    试试这个代码。我会解决你的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      相关资源
      最近更新 更多