2012-07-28 27 views
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から継承したクラスでこのコードを配置すると、それが動作します。

、なぜそれがカスタムビューで動作していませんか?

+0

が私のためにこれを固定 – Manuel

答えて

23

全てがカスタムビュークラスで行く:

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; 
} 
+0

MotionEvent.ACTION_CANCELのremoveCallbacksも呼び出す必要があります。 – kasgoku

+2

ACTION_MOVEはハンドラをキャンセルするため、削除する必要があります。 –

+1

作業中... ... !!! – InsaneCat

2

あなたのGestureDetectorのコンストラクタは廃止予定です(here)。最初のパラメータとしてコンテキストが必要な他のものを試すことができますか?

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

から編集 -

をあなたが別のリスナーを使用思える、このView.OnTouchListenerは他のonTouch()の方法があります。もう一度やり直せますか?

から編集 -

ここでは一例である(私のために働いていた):

... 
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 
    } 
}); 
+0

私は、あまりにもことを試みましたしかし、それは動作しません:( –

+0

はそれを行うためにどのように、私はあなたを得ることはありません? –

+1

あなたは歓迎:-)だ私はあなたが、自分自身に答えることができますあなたの質問を読んで、他の人々を助けるためにと考えています。 – Anh3Saigon

3

あなたGestureDetectorに長いプレスを可能にしましたか?適切なコンストラクタを使用するか、またはsetIsLongpressEnabledを呼び出すことによって、これを有効にすることができます。たとえば、次の操作を実行できます。

gestureDetector.setIsLongpressEnabled(true); 

コンストラクタこのコードの

+1

長押しはまだそれは私のために働いて偶然 –

+0

が動作していない動作していることを行わないために、48時間を待たなければなりません。ありがとう+1そのため –

0

それは私が推測する方が良いでしょう。.. onTouchEventからtrueを返す

public class Workflow extends View implements View.OnLongClickListener { 

public Workflow(Context context, DisplayFeatures d) { 
    super(context); 

    setLongClickable(true); 
    setOnLongClickListener(this); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    /* onTouchEvent should return super.onTouchEvent(event);, otherwise long click wouldn't be performed */ 
    return super.onTouchEvent(event); 
} 

@Override 
public boolean onLongClick(View v) { 
    Log.d("VIEW", "LONG CLICK PERFORMED!"); 
    return false; 
} 
} 
関連する問題