BlackBerry LongClickListener 구현
-
13-09-2019 - |
문제
구현해야 해요 OnLongClickListener BlackBerry 플랫폼용.
사용자 입력(예: 전화 키보드 구현) 또는 기타 기능(탐색, 되감기 제어, 확대/축소 제어 등)에 사용될 수 있습니다.요구사항은 다음과 같습니다.
- 수신할 대상 컨트롤 - 사용자 정의 ButtonField
- 4.5 및 4.6 버전과 호환되어야 하므로 touchEvents 등은 없습니다.
- 구성 가능한 긴 클릭 시간
개념과 구현에 대한 몇 가지 제안 사항이 있습니까?
또한 동일한 필드에 대해 여러 리스너를 사용하면 어떤 문제가 발생할 수 있나요?
감사합니다!
해결책
글쎄요, 그냥 솔직한 조언이에요.NavigationClick 및 NavigationUnclick을 재정의합니다. 폭풍은 화면을 누르는 것을 자동으로 이러한 이벤트에 매핑합니다.
실제로 클릭 시간을 측정하려면 별도의 스레드나 타이머를 사용해야 합니다. 그렇지 않으면 그렇게 할 방법이 없습니다(두 이벤트 모두에서 시간 매개변수를 얻지만 클릭이 해제되기 전에 이벤트가 실행되기를 원합니다).
또한 사용자가 클릭을 취소했다가 긴 클릭 간격 내에 다시 클릭하면 어떤 일이 발생하는지 주의해야 합니다.아마도 타이머를 다시 시작하고 싶을 것입니다.
다중 리스너는 어떠한 어려움도 제공해서는 안 됩니다. 리스너를 구현하는 모든 클래스가 올바르게 작동한다고 가정합니다(콜백 메서드 내에서 과도한 처리를 수행하지 않음).일반적으로 BlackBerry UI 구성 요소는 한 번에 최대 1개의 리스너를 가질 수 있습니다(이것이 addChangeListener 대신 setChangeListener가 있는 이유입니다).여러 청취자가 있는 Android 경로를 사용해야 하는 강력한 이유가 없다면 저는 하나만 고수하겠습니다. 그러면 구현이 좀 더 쉬워지고 BB 패러다임과도 일치합니다.
다른 팁
나는 Anthony의 조언, 구현을 사용했습니다 타이머스크 그리고 버튼 필드.
sucume_click 스타일로 닦으십시오 NavigationClick 이벤트 제외.
또한 Bold 9000/8900 Simulators로 고발 된 문제가 발생했습니다. 깔끔한. 그러나 샘플은 폭풍으로 잘 작동합니다.
상호 작용:
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));
}
});
}
}