2009-06-11 4 views
0

BlackBerryプラットフォーム用にOnLongClickListenerを実装する必要があります。
ユーザー入力(電話キーボードの実装など)やその他の機能(ナビゲーション、巻き戻しコントロール、ズームコントロールなど)に使用できます。 要件があります。耳を傾けるBlackBerry LongClickListenerの実装

  • ターゲット制御 - それは4.5と4.6とバージョンcompiliantする必要がありますカスタム
  • ButtonField、そうなどなしtouchEvents
  • は、DOは

設定可能な長いクリック時間概念と実装についていくつかの提案がありますか?
また、同じフィールドに複数のリスナーを使用するとどのような問題が発生する可能性がありますか?

ありがとうございました!

答えて

1

まあ、まっすぐなアドバイス。 navigationClickとnavigationUnclickをオーバーライドする - 嵐は自動的に画面上のプレスをこれらのイベントにマッピングします。

クリックを実際に実行するには、別のスレッドまたはタイマーを使用する必要があります。それ以外の方法はありません(両方のイベントで時間パラメータを取得しますが、そのイベントをunclick )。

また、ユーザーがクリックを解除し、長いクリック間隔の範囲内で再びクリックすると、何が起こるかについて注意する必要があります。タイマーをもう一度開始したいと思うかもしれません。

複数のリスナーは、リスナーを実装するすべてのクラスが正常に動作していることを前提にしています(コールバックメソッド内で処理が重くないこと)。一般に、BlackBerry UIコンポーネントは一度に最大1つのリスナーを持つことができます(そのため、addChangeListenerではなくsetChangeListenerが存在します)。複数のリスナーと一緒にアンドロイドのルートを行く魅力的な理由がない限り、私はちょうど1つを固執します - それは実装を少し容易にし、それはBBパラダイムと一貫しています。

+0

おかげでアンソニー、素晴らしいアドバイス! –

2

私はアンソニーのアドバイスに従って、TimerTaskとButtonFieldを使用して実装しました。
CONSUME_CLICKスタイルのcarfullになってください。どういうわけかexcludes navigationClick eventです。
また、Bold 9000/8900シミュレータでは問題が発生しました。ナビゲーショントラックはトラックホイールをにした後に解雇されましたです。しかし、サンプルはStormで正常に動作します。

インタフェース:

public interface LongClickListener { 
    public void longClickEvent(Field field, int eventNumber); 
} 

コントロール自体:

public class LongClickButtonField extends ButtonField { 

    boolean mContinuousMode = false; 
    Timer mLongClickTimer = null; 

    long mLongClickDelay = 1000; 
    long mContinuousPeriod = 500; 
    LongClickListener mLongClickListener = null; 

    public LongClickButtonField(String label) { 
     super(label); 
    } 

    public LongClickButtonField(String label, boolean continuousMode) { 
     this(label); 
     mContinuousMode = continuousMode; 
    } 

    public void setLongClickListener(LongClickListener longClickListener) { 
     mLongClickListener = longClickListener; 
    } 

    protected boolean navigationClick(int status, int time) { 
     mLongClickTimer = new Timer(); 
     final Field eventArg = this; 
     if(!mContinuousMode) 
     { 
     mLongClickTimer.schedule(new TimerTask() {public void run() { 
      mLongClickListener.longClickEvent(eventArg, 0); 
     }}, mLongClickDelay); 
     } 
     else 
     { 
      mLongClickTimer.schedule(new TimerTask(){ 
       int eventNum= 0; 
       public void run() {    
       mLongClickListener.longClickEvent(eventArg, eventNum); 
       eventNum++; 
      }}, mLongClickDelay, mContinuousPeriod); 
     } 
     return true; 
    } 

    protected boolean navigationUnclick(int status, int time) { 
     mLongClickTimer.cancel(); 
     return true; 
    } 
} 

用途:

public class Scr extends MainScreen implements LongClickListener { 
    LabelField mStatusLabel = new LabelField("status") { 
     protected void paint(Graphics graphics) { 
      graphics.setColor(Color.BLACK); 
      super.paint(graphics); 
     }; 
    }; 

    public Scr() { 
     LongClickButtonField button = new LongClickButtonField(
       "click & hold 5 s"); 
     LongClickButtonField buttonContinuous = new LongClickButtonField(
       "click & hold > 5 s", true); 
     button.setLongClickListener(this); 
     buttonContinuous.setLongClickListener(this); 
     add(mStatusLabel); 
     add(button); 
     add(buttonContinuous); 
    } 

    public void longClickEvent(final Field field, final int eventNumber) { 
     UiApplication.getUiApplication().invokeLater(new Runnable() { 
      public void run() { 
       mStatusLabel.setText( 
         ((ButtonField) field).getLabel() 
         + " event #" 
         + String.valueOf(eventNumber)); 
      } 
     }); 

    } 
} 
+0

@ MaxGontar..you素晴らしいです... !!! –

関連する問題