10

カスタム ビューでの長押しの検出に問題があります。

この問題に関連するコードは次のとおりです

final GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
    public void onLongPress(MotionEvent e) {
        Log.e("dbg_msg", "onLongPress");
    }
});

public boolean onTouchEvent(MotionEvent event) {
    return gestureDetector.onTouchEvent(event);
};

このコードは、すべての(短い)クリックを長押しとして検出します。

このコードをActivityから継承したクラスに入れると動作します。

では、なぜ custom View で機能しないのでしょうか?

4

4 に答える 4

25

このコードはすべて、カスタム ビュー クラスに入ります。

public static int LONG_PRESS_TIME = 500; // Time in miliseconds 

final Handler _handler = new Handler(); 
Runnable _longPressed = new Runnable() { 
    public void run() {
        Log.i("info","LongPress");
    }   
};

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch(event.getAction()){
    case MotionEvent.ACTION_DOWN:
        _handler.postDelayed(_longPressed, LONG_PRESS_TIME);
        break;
    case MotionEvent.ACTION_MOVE:
        _handler.removeCallbacks(_longPressed);
        break;
    case MotionEvent.ACTION_UP:
        _handler.removeCallbacks(_longPressed);
        break;
    }
    return true;
}
于 2012-07-28T16:04:17.503 に答える
4

よくわかりませんが、GestureDetectorのコンストラクタは非推奨です(ここ)。最初のパラメータとしてコンテキストを必要とする他のものを試してみませんか?

申し訳ありませんが、私は新しいのでコメントを投稿できません。

編集済み— </ p>

別のリスナーを使用したようです。これView.OnTouchListenerには別のonTouch()方法があります。もう一度やり直していただけませんか?

編集済み— </ p>

これが例です(私のために働いた):

...
mAnotherView.setOnTouchListener(new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return mGestureDetector.onTouchEvent(event);
    }
});

...
mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {

    @Override
    public void onLongPress(MotionEvent e) {
        // do your tasks here
    }
});
于 2012-07-28T14:54:49.337 に答える
4

GestureDetector で長押しを有効にしましたか? 適切なコンストラクターを使用するか、setIsLongpressEnabledを呼び出して有効にすることができます。たとえば、次のことができます。

gestureDetector.setIsLongpressEnabled(true);

あなたのコンストラクタで。

于 2012-07-28T15:16:53.600 に答える