【问题标题】:BlackBerry LongClickListener implementation黑莓 LongClickListener 实现
【发布时间】:2010-11-02 02:10:41
【问题描述】:

我需要为 BlackBerry 平台实现 OnLongClickListener
它可以用于用户输入(例如电话键盘实现)或其他功能(导航、倒带控制、缩放控制等)。 有要求:

  • 要监听的目标控件 - 自定义 ButtonField
  • 它应该是兼容 4.5 和 4.6 的版本,所以没有 touchEvents 等。
  • 可配置长点击时间

您对概念和实施有什么建议吗?
另外,对同一字段使用多个侦听器会遇到什么问题?

谢谢!

【问题讨论】:

    标签: blackberry navigation user-input keypress rim-4.5


    【解决方案1】:

    我听从了 Anthony 的建议,使用 TimerTask 和 ButtonField 实施。
    以 CONSUME_CLICK 风格尽情狂欢,不知何故 excludes navigationClick event
    此外,我在使用 Bold 9000/8900 模拟器时遇到了问题,在 未单击 拨轮后会触发 navigationClick。但是示例适用于 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));
                }
            });
    
        }
    }
    

    【讨论】:

      【解决方案2】:

      好吧,只是简单的建议。覆盖 navigationClick 和 navigationUnclick -storm 会自动将屏幕上的按下映射到这些事件。

      您必须使用单独的线程或计时器来实际计时点击 - 否则无法做到这一点(您确实在两个事件中都获得了时间参数,但您希望事件在取消点击之前触发) .

      此外,您还必须注意如果用户说取消点击然后在较长的点击间隔内再次点击会发生什么。可能你想重新启动计时器。

      多个侦听器不应该带来任何困难 - 假设实现侦听器的任何类都表现良好(不会在回调方法中进行繁重的处理)。通常,BlackBerry UI 组件一次最多可以有 1 个侦听器(这就是为什么有一个 setChangeListener 而不是 addChangeListener)。除非有令人信服的理由使用多个侦听器走 android 路线,否则我会坚持只使用一个 - 它会使实现更容易一些,并且与 BB 范式一致。

      【讨论】:

        猜你喜欢
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多