如何在BlackBerry中单击Horizo​​ntal FieldManager?

时间:2012-04-06 09:30:12

标签: blackberry java-me software-design

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

My HorizontalFieldManager filled with components

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

但问题是,用户应该可以点击这样的“行”。但由于HorizontalFieldManager不可聚焦或可点击,并且因为它内部有4个组件而且所有4个组件同样重要,所以我无法找到实现此目的的方法。

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

任何帮助都非常感谢!

3 个答案:

答案 0 :(得分:3)

BBdev直接回答了你的问题,但正如你所注意到的那样,表现非常缓慢。这是因为使用管理器来消除这样的数百行会给UI的布局步骤增加很多开销。每次屏幕上的某些内容发生变化时,布局都会针对所有这些经理运行 - 包括每次添加新行时。这基本上是二次方的。

提高速度的方法是使用ListField代替。 ListField的一个难点是你必须直接进行绘图,而不是依赖于标准的OS字段。但优点是ListField执行速度非常快 - 每行都有一个固定的高度,因此ListField可以快速确定哪些行是可见的,然后只为这些行调用paint代码。

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

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

}

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

答案 2 :(得分:0)

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

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

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