문제

구현해야 해요 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));
            }
        });

    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top