2009-06-11 62 views
0

我需要爲BlackBerry平臺實現OnLongClickListener
它可以用於用戶輸入(例如手機鍵盤實現)或其他功能(導航,後退控制,縮放控制等)。 有要求:BlackBerry LongClickListener實現

  • 目標控制聽 - 自定義ButtonField字段
  • 應該版本compiliant 4.5和4.6,所以沒有touchEvents等
  • 配置長按時間

待辦事項你對概念和實現有一些建議?
此外,我可以在同一領域使用多個偵聽器得到什麼問題?

謝謝!

回答

1

那麼,只是簡單的建議。覆蓋navigationClick和navigationUnclick - 風暴將自動將屏幕上的印刷機映射到這些事件。

您必須使用單獨的線程或定時器才能真正實現點擊時間 - 否則無法做到這一點(否則,您會在兩個事件中都獲得時間參數,但您希望事件在未點擊之前觸發)。

此外,您必須小心如果用戶說unclicks,然後再點擊一個長的點擊間隔範圍內會發生什麼。可能你想再次啓動計時器。

多個偵聽器不應該提供任何困難 - 假設任何類實現了偵聽器都表現良好(不會在回調方法中執行大量的處理)。通常,BlackBerry UI組件一次最多可以有一個偵聽器(這就是爲什麼有一個setChangeListener而不是addChangeListener)。除非有一個令人信服的理由去使用多個監聽器的android路由,否則我會堅持一個 - 它會使實現更容易一些,並且與BB範例一致。

+0

感謝安東尼,偉大的意見! – 2009-06-13 19:05:46

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 ..你真棒... !!! – 2012-11-11 07:32:14