0

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

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

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

谢谢!

4

2 回答 2

2

我遵循了 Anthony 的建议,使用TimerTask和 ButtonField 实现。
使用 CONSUME_CLICK 风格,以某种方式排除 navigationClick 事件
另外,我在使用 Bold 9000/8900 模拟器时遇到了问题,在unclicked拨轮后会触发 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));
            }
        });

    }
}
于 2009-06-20T09:40:15.900 回答
1

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

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

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

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

于 2009-06-13T02:19:33.527 回答