黑莓和Editfields

时间:2011-06-19 12:45:34

标签: blackberry blackberry-jde blackberry-editfield

这是一个非常基本的事情,但我似乎找不到搜索网络的答案。

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

我相信我读过的EditField使用它所在的容器的最大宽度。考虑到这一点,我想添加editFields来分离VerticalFieldManagers,然后将这些添加到我的Horizo​​ntalFieldManager就行了。以下是我正在执行此操作的代码。但不幸的是,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);

2 个答案:

答案 0 :(得分: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 - 一些非常狭窄,一些非常宽 - 如果你使用这个UI,那么一些设备将拥有非常狭窄的登录。恕我直言,最好与其他BlackBerry应用程序保持一致,并在不同的行上有用户名和密码。

答案 1 :(得分: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);

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