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

我必须在一个动态填充的HorizontalFieldManager循环中添加许多这样的for。合并在一起时,它看起来就像列表中的一行。到目前为止,我已经做到了这一点。
但问题是,用户应该能够单击类似的“行”。但是由于HorizontalFieldManager不具有可聚焦性或可点击性,而且由于它内有4个组件,而且所有4个组件都是同等重要的,所以我一直无法想出一种方法来做到这一点。
有人能建议我怎么做吗?基本上,用户应该能够单击在图像中显示的“行”。这个“行”由许多组件组成(2 HorizontalFieldManagers、1 VerticalFieldManager、1 BitmapField和3 LabelFields)。
任何帮助都非常感谢!
发布于 2012-04-08 18:45:27
BBdev直接回答了您的问题,但正如您注意到的,性能非常慢。这是因为使用一个管理器来清除这样的数百行,会给UI的布局步骤增加很多开销。布局将针对所有这些管理器运行,每次在屏幕上发生更改时--包括每次添加新行时。这基本上是二次型的。
加快速度的方法是使用ListField代替。ListField的一个痛点是,您必须直接绘图,而不是依赖标准的OS字段。但优点是ListField执行得非常快--每一行都有固定的高度,因此ListField可以快速确定哪些行是可见的,然后只为这些行调用画图代码。
这意味着工作尺度与该字段的可见大小,而不是该字段的虚拟大小。在编写UI代码时,这是一个非常需要维护的属性,因为UI的虚拟深度没有界限,但是物理屏幕有固定数量的像素,因此通过缩放UI中可见部分的工作,可以保持良好的性能。
发布于 2012-04-06 10:21:53
下面的代码将使您的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?");
}
});
}
}
}希望这能帮到你。干杯:)
发布于 2013-03-18 14:11:39
当您有一个水平字段数组时,如何处理焦点颜色?
for (int i = 0; i < listSize; i++) {
logInDetailManager[i] = new HorizontalFieldManager(
Manager.USE_ALL_WIDTH | Field.FOCUSABLE) {由于数组的某一项总是有焦点,所以整个列表都是红色的。
https://stackoverflow.com/questions/10041607
复制相似问题