我需要爲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