我需要为BlackBerry平台实现OnLongClickListener。
它可以用于用户输入(例如手机键盘实现)或其他功能(导航,后退控制,缩放控制等)。 有要求:BlackBerry LongClickListener实现
- 目标控制听 - 自定义ButtonField字段
- 应该版本compiliant 4.5和4.6,所以没有touchEvents等
- 配置长按时间
待办事项你对概念和实现有一些建议?
此外,我可以在同一领域使用多个侦听器得到什么问题?
谢谢!
我需要为BlackBerry平台实现OnLongClickListener。
它可以用于用户输入(例如手机键盘实现)或其他功能(导航,后退控制,缩放控制等)。 有要求:BlackBerry LongClickListener实现
待办事项你对概念和实现有一些建议?
此外,我可以在同一领域使用多个侦听器得到什么问题?
谢谢!
那么,只是简单的建议。覆盖navigationClick和navigationUnclick - 风暴将自动将屏幕上的印刷机映射到这些事件。
您必须使用单独的线程或定时器才能真正实现点击时间 - 否则无法做到这一点(否则,您会在两个事件中都获得时间参数,但您希望事件在未点击之前触发)。
此外,您必须小心如果用户说unclicks,然后再点击一个长的点击间隔范围内会发生什么。可能你想再次启动计时器。
多个侦听器不应该提供任何困难 - 假设任何类实现了侦听器都表现良好(不会在回调方法中执行大量的处理)。通常,BlackBerry UI组件一次最多可以有一个侦听器(这就是为什么有一个setChangeListener而不是addChangeListener)。除非有一个令人信服的理由去使用多个监听器的android路由,否则我会坚持一个 - 它会使实现更容易一些,并且与BB范例一致。
我遵循安东尼的建议,使用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));
}
});
}
}
@ MaxGontar ..你真棒... !!! – 2012-11-11 07:32:14
感谢安东尼,伟大的意见! – 2009-06-13 19:05:46