4

我正在 BlackBerry 中开发一个应用程序,我有许多HorizontalFieldManager充满组件的组件,如下图所示:

我的 Horizo​​ntalFieldManager 装满了组件

而且我必须在动态填充的循环中添加许多HorizontalFieldManager这样的 s 。for放在一起时,它看起来像列表中的单行。到目前为止,我已经能够做到这一点。

但问题是,用户应该能够像这样单击“行”。但由于HorizontalFieldManager是不可聚焦或可点击的,并且因为它内部有 4 个组件并且所有 4 个都同样重要,所以我无法找到一种方法来做到这一点。

那么任何人都可以建议一种方法来做我正在尝试的事情吗?基本上,用户应该能够单击图像中显示的“行”。此“行”​​由许多组件(2 HorizontalFieldManagers、VerticalFieldManager1、1BitmapField和 3 LabelFields)组成。

非常感谢任何帮助!

4

3 回答 3

3

BBdev 直接回答了您的问题,但正如您所注意到的,性能相当缓慢。这是因为像这样使用管理器删除数百行会增加 UI 布局步骤的大量开销。布局将针对所有这些管理器运行,每次屏幕上发生变化时 - 包括每次添加新行时。这基本上是二次的。

加快速度的方法是改用ListField。ListField 的一个痛点是您必须直接进行绘图,而不是依赖于标准的操作系统字段。但优点是 ListField 执行速度非常快——每一行都有固定的高度,因此 ListField 可以快速确定哪些行是可见的,然后只为这些行调用绘制代码。

这意味着工作随着字段的可见大小而不是字段的虚拟大小进行缩放。这是编写 UI 代码时非常需要维护的属性,因为 UI 的虚拟深度没有界限,但物理屏幕具有固定数量的像素,因此通过使用 UI 的可见部分缩放工作,您可以维护很棒的表演。

于 2012-04-08T18:45:27.057 回答
2

下面的代码将使您可以HorizontalFieldManager点击,并根据需要在此 Hfm 中添加您的组件。

import net.rim.device.api.system.Display;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.TouchEvent;
import net.rim.device.api.ui.Touchscreen;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.NullField;
import net.rim.device.api.ui.container.HorizontalFieldManager;
import net.rim.device.api.ui.container.MainScreen;

public class sample extends MainScreen implements FieldChangeListener{

 HorizontalFieldManager logInDetailManager=null;
 int background_color=0;

 public sample() {

logInDetailManager = new HorizontalFieldManager(Manager.USE_ALL_WIDTH|Field.FOCUSABLE){
    protected void sublayout(int maxWidth, int maxHeight) {
            int height=40;
        super.sublayout(Display.getWidth(), height);
        setExtent(Display.getWidth(), height);
    }
    protected void paint(Graphics graphics) {

        graphics.setBackgroundColor(background_color);
        graphics.clear();
        invalidate();
        super.paint(graphics);
    }
    protected void onFocus(int direction) {
        super.onFocus(direction);
        background_color=Color.RED;
        invalidate();
    }
    protected void onUnfocus() {
        invalidate();
        background_color=Color.GREEN;

    }
    protected boolean navigationClick(int status, int time) {

        if(Touchscreen.isSupported()){
            return false;
        }else{
            fieldChangeNotify(1);
            return true;
        }

    }
    protected boolean touchEvent(TouchEvent message)
    {
        if (TouchEvent.CLICK == message.getEvent())
        {
            FieldChangeListener listener = getChangeListener();
            if (null != listener)
                this.setFocus();
                listener.fieldChanged(this, 1);
        }
        return super.touchEvent(message);
    }
};
logInDetailManager.setChangeListener(this);
logInDetailManager.add(new LabelField("hello"));
logInDetailManager.add(new NullField(Field.FOCUSABLE));
add(logInDetailManager);
add(new LabelField("good",Field.FOCUSABLE));    
}

  public void fieldChanged(Field field, int context) {            
if(field==logInDetailManager){                  
    UiApplication.getUiApplication().invokeLater(new Runnable() {                          
        public void run() {                                 
            Dialog.inform("Hi how are you?");                          
        }                    
    });          
}   
}

}

希望这会帮助你 。干杯:)

于 2012-04-06T10:21:53.263 回答
0

当您有一组水平字段时如何处理焦点颜色?

for (int i = 0; i < listSize; i++) {
        logInDetailManager[i] = new HorizontalFieldManager(
                Manager.USE_ALL_WIDTH | Field.FOCUSABLE) {

由于数组的一项始终聚焦,因此整个列表都是红色的。

于 2013-03-18T14:11:39.490 回答