2011-06-18 1 views
4

私はフィールドの外で/タッチを押すと、フォーカスがあるフィールドに対してfieldChanged()イベントがトリガーされる問題があります。私はどちらかFieldManagerの内側にボタン/フィールドを押すとBlackBerry touchEvent from Field triggers fieldChanged

public class myMainScreen extends MainScreen implements FieldChangeListener{ 

    public myMainScreen(){ 
     CustomFM1 fm1 = new CustomFM1(); 
     CustomFM2 fm2 = new CustomFM2(); 

     add(fm1); 
     add(fm2); 
    } 

} 

はそれが正常に動作します:私のMainScreenため

レイアウトは、かなりまっすぐ進むので、のようなものです。問題は私が空きスペースを押すときです。だから、私がfm2の空きスペースを押しての中にfm1があると、そのフィールド変更イベントが発生します。

現時点では、私の救済策はtouchEventにキャッチして、適切なFieldManagerに渡すことです。 touchEventフィールドが実際に

を押された場合、私のCustomFMは、そのようにmyMainScreenにタッチイベントは次のようになり、フィールドを取得し、fieldChangedを呼び出す扱うでしょうのために:

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; 

} 

私はこれに簡単な解決策があると思いますか?何か不足していますか?

+0

5.0 9550シミュレータでは再現できません:2つの水平フィールドマネージャー、それぞれにクリック消費ボタンフィールドがあります。正常に動作します。マネージャの空のスペースをクリックしても、FieldChangeListenerイベントは発生しません。現在使用しているバージョン/デバイス –

+0

@Max torch OS6。私はそれが今考え出されたと思う。この投稿への回答は[http://stackoverflow.com/questions/5948222/blackberry-click-outside-field]の助けとなりました。私はちょっと答えを投稿するつもりです。私が上でやっていたことは、ちょっとした印だった。 –

+0

私は同じ問題を抱えていました。 ここをクリックしてください[BlackBerry outside outside Field](http://stackoverflow.com/questions/5948222/blackberry-click-outside-field) – aeracode

答えて

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; 

    } 
1

トリックはtouchEvent(TouchEvent message)を上書きしません。 :)

クリックを処理したいフィールドにちょうどnavigationClick(int status, int time)をオーバーライドしてください(ちょうど明白です - ButtonFieldのためにこれを行う必要はありません - それはうまくいきます)。ユーザーがタッチスクリーン上のフィールドをクリックすると、BB UIフレームワークでnavigationClick(int status, int time)が呼び出されます。同様に、非タッチスクリーンデバイスでも動作します。

+0

ええ、私はそれを試みた。何が起きているのかは、フィールドの外の画面に触れると 'TouchEvent.Click'とそれに続く' navigationClick'となり、 'fieldChangeNotify'が呼び出されます。私はそれがOS5で起こっていないと思うが、それは私のためのOS6に、デバイス上にあります。 –

3

ちょうど同じ問題がありました。タッチイベントがtouchEventで消費されない場合、主な問題はnavigationClicktrackwheelClickが呼び出されることです。

ソリューションは、クリックが非接触イベントによってトリガーされた場合*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; 
} 

このメソッドを使用すると、タッチイベントがフィールドの境界内にあったかどうか追跡する必要がないことを意味します。