質問

実装する必要があります OnLongClickListener BlackBerry プラットフォーム用。
ユーザー入力 (電話のキーボード実装など) またはその他の機能 (ナビゲーション、巻き戻し制御、ズーム制御など) に使用される場合があります。要件があります:

  • リッスンするターゲット コントロール - カスタム ButtonField
  • バージョンは 4.5 および 4.6 に準拠している必要があるため、touchEvents などはありません。
  • 設定可能な長いクリック時間

コンセプトと実装について何か提案はありますか?
また、同じフィールドに複数のリスナーを使用するとどのような問題が発生する可能性がありますか?

ありがとう!

役に立ちましたか?

解決

まあ、ただ簡単なアドバイス。 navigationClickとnavigationUnclickをオーバーライド - 嵐は自動的にこれらのイベントに画面上の押下をマッピングします。

あなたが実際に時間をクリックし、別のスレッドやタイマーを使用する必要があります - それ以外の場合は(あなたは両方のイベントに時間パラメータを得るかが、あなたは、イベントがunclick前に解雇したい)ことを行うための方法はありませんます。

また、ユーザーが長いクリック間隔のスパン以内に再度クリックした後、unclicksを言うとどうなるかについて注意する必要があります。おそらく、あなたは再びタイマーを開始します。

複数のリスナーは、任意の難易度を提供しないでください - どのクラスがリスナーを実装することを想定する(コールバックメソッド内で重い処理を行わない)行儀あります。一般的にBlackBerryのUIコンポーネントは、(代わりのaddChangeListenerのsetChangeListenerがあります理由です)一度に1人のリスナーの最大を持つことができます。複数のリスナーを持つアンドロイドのルートを移動するための説得力のある理由がありますがない限り、私はちょうど1に固執したい - それは実装が少し楽に作ってあげる、それがBBパラダイムと一致します。

他のヒント

私はアンソニーのアドバイスに従い、次を使用して実装しました タイマータスク とボタンフィールド。
CONSUME_CLICK スタイルで気を付けてください。 NavigationClick イベントを除外します.
また、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));
            }
        });

    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top