我遇到了一个问题,如果我在某个字段外按/触摸会为有焦点的字段触发fieldChanged()
事件。
我MainScreen
的布局很简单,就像这样:
public class myMainScreen extends MainScreen implements FieldChangeListener{
public myMainScreen(){
CustomFM1 fm1 = new CustomFM1();
CustomFM2 fm2 = new CustomFM2();
add(fm1);
add(fm2);
}
}
如果我按下FieldManager
内的按钮/字段,它可以正常工作。问题是当我按空空间时。因此,如果我要在fm2
内的空白区域内按下并且Field
内的fm1
有焦点,则会触发其fieldchanged事件。
目前,我的补救方法是抓住touchEvent
并将其传递给相应的FieldManager
。然后我的touchEvent
的{{1}}将处理获取字段并调用fieldChanged(如果实际上已按下某个字段)
所以在CustomFM
touchEvent看起来像:
myMainScreen
我的CustomFM2的protected boolean touchEvent(TouchEvent message){
int index = this.getFieldAtLocation(message.getX(1), message.getY(1));
switch(index){
case 0:
fm1.touchEvent(message);
break;
case 1:
fm2.touchEvent(message);
break;
}
return true;
}
是。
touchEvent
是fm2与屏幕相关的前y位置。
OFFSET
我想知道的是,如果有更简单的解决方案吗?我错过了什么吗?
答案 0 :(得分:3)
刚刚遇到同样的问题。主要问题是,如果navigationClick
中没有使用触摸事件,则会调用trackwheelClick
和touchEvent
。
解决方案是,如果点击是由非触摸事件触发,则仅在fieldChangeNotify
方法 内调用*Click
。触摸事件的状态为0,因此您可以按如下方式检查:
protected boolean navigationClick( int status, int time ){
if (status != 0) fieldChangeNotify(0);
return true;
}
protected boolean trackwheelClick( int status, int time ){
if (status != 0) fieldChangeNotify(0);
return true;
}
此方法意味着您无需跟踪触摸事件是否在字段范围内。
答案 1 :(得分:2)
似乎我在做什么有点过时了。我不需要把事件传递下来。这是自然地(或不自然地完成,因为具有焦点的Field
似乎是在没有被触及的情况下接收TouchEvents
事件。似乎正在发生的事情是TouchEvent.Click
navigationClick
被发送到该字段后。在navigationClick
我正在调用fieldChangeNotify(0)
要解决这个问题,我的Field
的{{1}}和touchEvent
现在看起来像这样:
navigationClick
我也跟踪 private boolean touchEventInside;
...
protected boolean touchEvent(TouchEvent message) {
if(message.getX(1) < 0 || message.getX(1) > getWidth() || message.getY(1) < 0 || message.getY(1) > getHeight()) {
touchEventInside = false;
return false;
}else{
touchEventInside = true;
return true;
}
}
protected boolean navigationClick(int status, int time) {
if(((myMainScreen)this.getScreen()).touchStarted){
if(touchEventInside){
fieldChangeNotify(0);
}
}else{
fieldChangeNotify(0);
}
return true;
}
中启动的触摸事件,如下所示:
myMainScreen
答案 2 :(得分:1)
诀窍是不要覆盖touchEvent(TouchEvent message)
。 :)
只需覆盖要处理点击的字段navigationClick(int status, int time)
(只是为了清楚 - 不需要为ButtonField
执行此操作 - 它的工作原理很好)。当用户在触摸屏上单击您的字段时,BB UI框架将调用navigationClick(int status, int time)
。它也适用于非触摸屏设备。