Events for long click and long press on Android

I want two separate events for a long press of the Down and Yes buttons. How can I do this in Android?

What I tried looks like this

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 the activity that I called so

 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 I still don't get any log messages in logcat Can someone help me; where am i wrong

+3
android android-button
source share
3 answers

onKeyXXX() methods are designed for key events from the keyboard or hard keys, such as the menu key, search key, etc.

If you want to detect touch events called MotionEvent in Android, you need to override the onTouchEvent(MotionEvent e) method and use the GestureDetector class to identify long presses.

 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 } } } 
+6
source share

Something like this will lead you to the right path,

I did not compile, so you have to fix a few syntax things, but your goal can be achieved with this concept.

 OnTouchListener mTouchListener = new OnTouchListener(){ private totalTimeDown = -1; private downTime = -1; public boolean onTouch(View v, MotionEvent me){ if(me.getAction() == MotionEvent.ACTION_DOWN){ downTime = System.getCurrentTimeInMillis(); return true; } if(me.getAction() == MotionEvent.ACTION_UP){ totalTimeDown = System.getCurrentTimeInMillis() - downTime; if(totalTimeDown > 500){ //Finger was down long enough for "longClick" return true; } } return false; } }); 
+3
source share
 holder.layout.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch(event.getAction()) { case MotionEvent.ACTION_DOWN: new Handler().postDelayed(new Runnable() { @Override public void run() { holder.layoutItem.setVisibility(View.GONE); holder.layoutDelete.setVisibility(View.VISIBLE); } }, 1000); // PRESSED return true; // if you want to handle the touch event case MotionEvent.ACTION_UP: holder.layoutItem.setVisibility(View.VISIBLE); holder.layoutDelete.setVisibility(View.GONE); // RELEASED return true; // if you want to handle the touch event } return false; } }); 
0
source share

All Articles