Events for Long click down and long click up in Android

android, android-button

Solution

`onKeyXXX()` methods are for Key Events from keyboard or hard keys such as menu key, search key, and so on.

If you want to detect touch events, which is called `MotionEvent` in Android, you have to override `onTouchEvent(MotionEvent e)` method and use `GestureDetector` class for identifying long press.

private GestureDetector mGestureDetector;

public FfwRewButton(...) {
    //....
    mGestureDetector = new GestureDetector(context, 
        new GestureDetector.SimpleOnGestureListener() {
            public boolean onDown(MotionEvent e) {
                mLongClicked = false;
                return true;
            }
            public void onLongPress(MotionEvent e) {
                mLongClicked = true;
                // long press down detected
            }
        });
    }

    public boolean onTouchEvent(MotionEvent e) {
        mGestureDetector.onTouchEvent(e);
        if (mLongClicked && e.getAction() == ACTION_UP) {
           // long press up detected
        }
    }
}

Problem

I want two separate event for long click Down and Long click up. How can I do this in Android? What I have tried is as follows ``` public class FfwRewButton extends ImageButton { public interface ButtonListener { void OnLongClickDown(View v); void OnLongClickUp(View v); } private ButtonListener mListener; private boolean mLongClicked = false; public FfwRewButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setFocusable(true); setLongClickable(true); } public FfwRewButton(Context context) { this(context, null); } public FfwRewButton(Context context, AttributeSet attrs) { this(context, attrs, android.R.attr.imageButtonStyle); } @Override public boolean onKeyLongPress(int keyCode, KeyEvent event) { Log.d("my listener", "long press"); mLongClicked = true; mListener.OnLongClickDown(this); return super.onKeyLongPress(keyCode, event); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { Log.d("my listener", "key down"); mLongClicked = false; if (true) { super.onKeyDown(keyCode, event); return true; } return super.onKeyDown(keyCode, event); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { Log.d("my listener", "key up"); if (mLongClicked) mListener.OnLongClickUp(this); return super.onKeyUp(keyCode, event); } public void setFfwRewButtonListener(ButtonListener listener) { mListener = listener; } } ``` and in an activity I called it like this ``` private FfwRewButton.ButtonListener mListener = new FfwRewButton.ButtonListener() { @Override public void OnLongClickUp(View v) { Log.d(TAG, "longClickup"); } @Override public void OnLongClickDown(View v) { Log.d(TAG, "longClickdown"); } }; ``` But still am not getting any of the Log messages in logcat Can anyone help me; where I am wrong ?

Original source