我正在开发一个BlackBerry应用程序,我有很多HorizontalFieldManager
填充了如下图所示的组件:
我必须在动态填充的HorizontalFieldManager
循环中添加许多for
个。在一起使用时,它看起来像列表中的单行。到目前为止,我已经能够做到这一点。
但问题是,用户应该可以点击这样的“行”。但由于HorizontalFieldManager
不可聚焦或可点击,并且因为它内部有4个组件而且所有4个组件同样重要,所以我无法找到实现此目的的方法。
所以有人可以建议一种方法来做我正在尝试的事情吗?基本上,用户应该能够单击图像中显示的“行”。此“行”由许多组件组成(2 HorizontalFieldManager
s,1 VerticalFieldManager
,1 BitmapField
和3 LabelFields
)。
任何帮助都非常感谢!
答案 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) {
由于阵列中的一个项目始终是聚焦的,因此整个列表都是红色的。