2009-06-11 66 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