BlackBerry touch事件外部字段触发字段更改

时间:2011-06-18 19:12:12

标签: blackberry

我遇到了一个问题,如果我在某个字段外按/触摸会为有焦点的字段触发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

我想知道的是,如果有更简单的解决方案吗?我错过了什么吗?

3 个答案:

答案 0 :(得分:3)

刚刚遇到同样的问题。主要问题是,如果navigationClick中没有使用触摸事件,则会调用trackwheelClicktouchEvent

解决方案是,如果点击是由非触摸事件触发,则仅在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)。它也适用于非触摸屏设备。