【问题标题】:BlackBerry touchEvent outside Field triggers fieldChangedBlackBerry touchEvent 外场触发 fieldChanged
【发布时间】:2012-08-13 22:33:21
【问题描述】:

我遇到了一个问题,如果我在字段外按下/触摸,则会为具有焦点的字段触发 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 中的空白区域并且 fm1 内的 Field 具有焦点,则会触发其 fieldchanged 事件。

目前,我的补救措施是捕获touchEvent 并将其传递给适当的FieldManager。我的CustomFMtouchEvent 然后将处理获取该字段并调用 fieldChanged,如果一个字段实际上已被按下

所以在myMainScreen touchEvent 看起来像:

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;
}

我的 CustomFM2 的 touchEvent 是。 OFFSET 是 fm2 的顶部 y 位置,相对于屏幕。

protected boolean touchEvent(TouchEvent message){

    switch(message.getEvent()){

    ... 

        case TouchEvent.UP:
            int index = this.getFieldAtLocation(message.getGlobalX(1), message.getGlobalY(1) - OFFSET);
            if(index != -1){
                Field field = getField(index);
                field.getChangeListener().fieldChanged(field, 0);

            }

            break;

    }

    return true;

}

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

【问题讨论】:

  • 无法使用 5.0 9550 模拟器重现它:2 个水平字段管理器,每个字段中都有点击消费按钮字段。工作正常。单击经理的空白区域不会触发 FieldChangeListener 事件。您使用的是哪个版本/设备?
  • @Max 火炬 OS6。我想我现在明白了。这篇文章的答案帮助了[stackoverflow.com/questions/5948222/…。一会儿我会发布答案。我在上面做的事情有点离题。
  • 我遇到了同样的问题。请在此处查看答案BlackBerry click outside Field

标签: blackberry


【解决方案1】:

刚刚遇到同样的问题。主要问题是navigationClicktrackwheelClicktouchEvent 中没有消费触摸事件时会被调用。

解决方案是在*Click 方法中调用fieldChangeNotify 如果点击是由非触摸 事件触发的。触摸事件的状态为 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;
}

此方法意味着您不需要跟踪触摸事件是否在字段范围内。

【讨论】:

    【解决方案2】:

    似乎我做的有点不对劲。我不需要传递事件。这是自然地完成的(或不自然地,因为具有焦点的Field 似乎正在接收TouchEvents 事件,如果它没有被触摸)。似乎正在发生的事情是,在将 TouchEvent.Click 发送到现场后,navigationClick 会发生。在navigationClick 我打电话给fieldChangeNotify(0)

    要解决这个问题,我的FieldtouchEventnavigationClick 现在看起来像这样:

        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 中开始的触摸事件,如下所示:

        protected boolean touchStarted;
        ...
        protected boolean touchEvent(TouchEvent message){
    
            if(message.getEvent() == TouchEvent.UP){
                touchStarted = false;
            }else if(message.getEvent() == TouchEvent.DOWN){
                touchStarted = true;
            }   
            super.touchEvent(message);
            return false;
    
        }
    

    【讨论】:

      【解决方案3】:

      诀窍是根本不覆盖touchEvent(TouchEvent message)。 :)

      只需为您要处理点击的字段覆盖navigationClick(int status, int time)(只是为了清楚 - 无需为ButtonField 执行此操作 - 它可以正常工作)。当用户在触摸屏上单击您的字段时,BB UI 框架将调用navigationClick(int status, int time)。它也适用于非触摸屏设备。

      【讨论】:

      • 是的,我试过了。发生的事情是,当我在字段外触摸屏幕时,我得到一个TouchEvent.Click,然后是navigationClick,而后者又调用fieldChangeNotify。我猜它不会在 OS5 上发生,但它在我的 OS6 上,在设备上。
      猜你喜欢
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      相关资源
      最近更新 更多